下面两行代码在 Go 语言中做同样的事情吗?我想要做的是将一个切片复制到另一个切片中:
slice1 := make([]int, 5)
slice2 := slice1 #line1
slice2 := slice1[:] #line2
我运行这段代码来测试行为,但显然它们都以相同的方式工作:
func main() {
s1 := make([]int, 5, 5)
s1[2] = 33
fmt.Printf("s1: %v: address of slice %p\n", s1, &s1)
s2 := s1[:]
s2[1] = 5
fmt.Printf("s2: %v: address of slice %p\n", s2, &s2)
s3 := s1
s3[0] = 23
fmt.Printf("s3: %v: address of slice %p\n",s3, &s3)
fmt.Printf("s2: %v: address of slice %p\n", s2, &s2)
fmt.Printf("s1: %v: address of slice %p\n", s1, &s1)
}
输出是:
s1: [0 0 33 0 0]: address of slice 0x40c0e0
s2: [0 5 33 0 0]: address of slice 0x40c100
s3: [23 5 33 0 0]: address of slice 0x40c120
s2: [23 5 33 0 0]: address of slice 0x40c100
s1: [23 5 33 0 0]: address of slice 0x40c0e0
因此,切片(s1、s2、s3)的内存地址不同,但指向包含在其中的数组的指针指向相同的内存地址。
我想知道这两种方式之间是否有什么变化,或者是否有某种约定说明更好用。
紫衣仙女
相关分类