2014-09-12 79 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