请查看以下代码段。
package main
import (
"fmt"
)
type class struct {
prop1 string
prop2 string
}
func main() {
va1 := &class{"Hello", "Foo"}
fmt.Println(&va1)
va1 = &class{"TOO", "Boo"}
fmt.Println(&va1)
}
结果我得到了同样有针对性的地址。
0x1215a0c0
0x1215a0c0
使用& T {},它将分配新的归零值地址。但为什么我在这里有相同的地址呢?我只是覆盖第二次赋值吗?
答案 0 :(得分:3)
声明
fmt.Println(&va1)
打印变量va1
的地址,而不是va1
指向的地址。变量的地址不会改变。
试试这个程序:
va1 := &class{"Hello", "Foo"}
fmt.Printf("&va1: %v, pointer: %p, value: %v\n", &va1, va1, va1)
va2 := va1
va1 = &class{"TOO", "Boo"}
fmt.Printf("&va1: %v, pointer: %p, value: %v\n", &va1, va1, va1)
fmt.Printf("&va2: %v, pointer: %p, value: %v\n", &va2, va2, va2)
此程序打印:
&va1: 0x1030e0c0, pointer: 0x10328000, value: &{Hello Foo}
&va1: 0x1030e0c0, pointer: 0x10328050, value: &{TOO Boo}
&va2: 0x1030e0d0, pointer: 0x10328000, value: &{Hello Foo}
请注意,变量va1的地址不会改变,但va1指向的地址会发生变化。另外,指向va1的指针不会修改指向的值va1。