2017-03-06 109 views
-1

我想在Golang中闡明這種行爲, 爲什麼當你在數組上使用內存引用,並且改變這個引用的值時,引用數組中沒有任何變化。Golang數組指針

一個例子:

var t [5]int 
printType(t,"t") 
p := &t 
printType(p,"p") 
x := *p 
x[0] = 4 
printType(x,"x") 
printType(p,"p") 
printType(t,"t") 

此代碼返回

[t] Type:[5]int Kind:array Adr:%!p([5]int=[0 0 0 0 0]) Value:([0 0 0 0 0]) 
[p] Type:*[5]int Kind:ptr Adr:0xc4200142d0 Value:(&[0 0 0 0 0]) 
[x] Type:[5]int Kind:array Adr:%!p([5]int=[4 0 0 0 0]) Value:([4 0 0 0 0]) 
[p] Type:*[5]int Kind:ptr Adr:0xc4200142d0 Value:(&[0 0 0 0 0]) 
[t] Type:[5]int Kind:array Adr:%!p([5]int=[0 0 0 0 0]) Value:([0 0 0 0 0]) 

你可以看到內存地址是相同的,但值 「4」 是不存在的。

方法打印類型

func printType(i interface {},message string) { 
    k := reflect.TypeOf(i).Kind().String() 
    fmt.Printf("[%s] Type:%T Kind:%s Adr:%[2]p Value:(%[2]v)\n",message,i,k) 
} 

回答

-1

好吧發現,運營商 「:=」 分配一個新的內存地址。

1

好的發現它,運算符「:=」分配一個新的內存地址。

不,它不分配任何東西。

var t [5]int是一個值。請注意,根據規格[5]int如果在這種情況下全名類型。你可以把它看作一個帶有5 int字段的結構體。行x := *p使取消引用指向t(值)。賦值會創建它的一個副本。如果你想通過一個「參考」t作它的片段:t[:]