最近正在看golang基础 (又开新坑了这是= =) 看到数组部分 写demo测试的时候发现有个小不同
package main
import (
"errors"
"fmt"
"strconv"
)
func main(){
// 指定数组长度
// 传入函数形参时会拷贝一份新的数组值 修改的是函数内部的拷贝副本
arr := [3]int{1,2,3}
updateArr(arr) // [1,2,3]
// 不定数组长度
// 此处为一个切片为一个引用类型 传递的事指针地址遂等同于下方操作
arr := []int{1,2,3}
updateArrTwo(arr)
// 指定数组长度并传入地址值
// 传入地址值好理解 直接修改了原数组数据
arr := []int{1,2,3}
updateArrThree(&arr)
fmt.Println(arr) // [1,7,3]
}
func updateArr(arr [3]int){
arr[1] = 7
}
func updateArrTwo(arr []int){
arr[1] = 7
}
func updateArrThree(arr *[]int){
(*arr)[1] = 7
}
然后就舔着个脸去问GPT
发现了切片这个概念 于是去官网去找 结合csdn一位博主所说:
————————————————
- 切片(slice)是golang中一种特有的数据类型
- 数组有特定的用处,但是却有一些呆板(数组长度固定不可变),所以在 Go 语言的代码里并不是特别常见。相对的切片却是随处可见的,切片是一种建立在数组类型之上的抽象,它构建在数组之上并且提供更强大的能力和便捷。
- 切片(slice)是对数组一个连续片段的引用,所以切片是一个引用类型。这个片段可以是整个数组,或者是由起始和终止索引标识的一些项的子集。需要注意的是,终止索引标识的项不包括在切片内。切片提供了一个相关数组的动态窗口。
————————————————
package main
import (
"fmt"
)
func main(){
//定义数组:
intarr := [6]int{3, 6, 9, 1, 4, 7}
//切片构建在数组之上
slice := intarr[1 : 3]
//输出数组
fmt.Println("intarr:", intarr) // [3 6 9 1 4 7]
//输出切片
fmt.Println("slice:", slice) // [6 9] 包头不包尾
//输出切片个数
fmt.Println("slice的元素个数", len(slice)) // 2
// 修改切片数据
slice[1] = 55
//输出修改后切片
fmt.Println("slice2:", slice) // [6 55]
//输出修改后数组
fmt.Println("intarr2:", intarr) // [3 6 55 1 4 7] 原数组数据也更改了
}
如果使用make创建一个空切片并将原值copy到空切片上 这两个变量的字面量是相同的
package main
import (
"fmt"
)
func main(){
// 切片的定义
intarr2 := []int{1, 2, 3, 4, 5, 6}
slice2 := intarr2[0:6]
// 此处的切片slice2和intarr2共享同一个底层数组 但是两人堆中的地址值不相同
// 并不能简单的理解成地址值相同那这两个变量就是一个完全相同的引用类型变量
}
这句感觉很关键
刚在学习阶段 理解的不是很透彻 记录一下 待以后学成而归再修正
评论 (0)