package main
import (
"fmt"
)
func main() {
t1 := []int{1, 2, 3}
t2 := t1
t1[2] = 111
fmt.Printf("%p\t", &t1)
fmt.Println(t1)
fmt.Printf("%p\t", &t2)
fmt.Println(t2)
}
按照书上所言,应该是同一个地址,但是这里的输出是
0x210231000 [1 2 111]
0x210231040 [1 2 111]
指针不同,很奇怪,求大神解惑
测试环境,mac和linux
#1
更多评论
啥书上说的?
你这样 &t1,是取 t1 变量本身的地址。可以理解为 t1 是类似 java 中的引用类型,t1 和 t2 引用同样的一个 slice,但它们本身的地址是不一样的(本身的地址并非是 slice 的地址)
#2
自问自答吧,应该和golang的编译器处理有关
注释掉
fmt.Printf("%p\t", &t1)
fmt.Printf("%p\t", &t2)
打开-gcflags "-N -l"的编译选项,gdb断点看,地址就是同一个
不知道为啥加了这两行就不对,好诡异
#3