用新值覆盖现有值

时间:2014-09-12 14:38:42

标签: go

请查看以下代码段。

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

1 个答案:

答案 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。