为了账号安全,请及时绑定邮箱和手机立即绑定

用新值覆盖现有值

用新值覆盖现有值

Go
慕容708150 2021-08-16 18:29:21
看下面的代码片段。package mainimport (    "fmt")type class struct {    prop1 string    prop2 string}func main() {    va1 := &class{"Hello", "Foo"}    fmt.Println(&va1)    va1 = &class{"TOO", "Boo"}    fmt.Println(&va1)}结果我得到了相同的指向地址。0x1215a0c00x1215a0c0使用 &T{} 它将分配新的零值地址。但为什么在这里我有相同的地址?我是否只是在第二次赋值时覆盖该值?
查看完整描述

1 回答

?
交互式爱情

TA贡献1712条经验 获得超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 指向的值。


查看完整回答
反对 回复 2021-08-16
  • 1 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信