2014-09-12 32 views
-4

请看下面的代码片段。用新值覆盖现有值

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 

With & T {}它会分配新的归零值地址。但为什么我在这里得到了同样的地址?我只是重写第二次赋值的值?

+6

地址。请通过Go游览和Effective Go进行工作。 – Volker 2014-09-12 14:41:52

+0

您正在打印'** class' – JimB 2014-09-12 14:44:47

回答

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。

+0

要获取变量的地址:'fmt.Printf(“%p,%p \ n”,va1,va2)' – OneOfOne 2014-09-12 15:36:11