直接上代码
func main() {
a := []int{1,2,3}b := []int{4,5,6}
c := []int{7,8,9}
a = a[1:]
fmt.Println("a", a)
func(x []int){
fmt.Println("x", x, &x[0])
x = x[1:]
fmt.Println("x", x, &x[0])
}(b)
fmt.Println("b", b, &b[0])
func(x *([]int)){
*x = (*x)[1:]
}(&c)
fmt.Println("c", c)
}
输出
a [2 3]
x [4 5 6] 0xc21000a040
x [5 6] 0xc21000a048
b [4 5 6] 0xc21000a040
c [8 9]
原理
go slice实现是一个type Slice struct{ptr *type, len int, cap int},指向内存中列表首地址指针,列表长度,列表容量
当使用slice传参时,会复制一个Slice对象,在函数内全部修改都是针对复制品Slice,如果想要在函数内修改函数外传入的Slice对象,请传递Slice指针
打印slice时,会根据列表长度进行打印,slice传值不会修改函数外的Slice对象的首地址指针,列表长度,列表容量