用新值覆盖现有值

看下面的代码片段。


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{} 它将分配新的零值地址。但为什么在这里我有相同的地址?我是否只是在第二次赋值时覆盖该值?


慕容708150
浏览 182回答 1
1回答

交互式爱情

该声明fmt.Println(&va1)打印变量的地址va1,而不是va1指向的地址。变量的地址不会改变。试试这个程序:va1 := &class{"Hello", "Foo"}fmt.Printf("&va1: %v, pointer: %p, value: %v\n", &va1, va1, va1)va2 := va1va1 = &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 指向的值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go