2016-11-22 45 views
0

Golang新手來自Java世界。我有這個非常簡單的一塊方案:Golang數組更新不起作用

package main 

import "fmt" 

type Foo struct { 
    A [5]int 
} 

func main() { 
    s := make([]Foo, 0) 
    var foo Foo 
    s = append(s, foo) 
    foo.A[0] = 42 
    fmt.Printf("%v", s[0].A) 
} 

然而,這種打印[0,0,0,0,0]而不是[42,0,0,0,0]我的預期。在交換s = append(s, foo)foo.A[0] = 42行後,它會打印[42,0,0,0,0]。這是爲什麼?提前致謝。

回答

1

s是類型爲Foo的元素的切片。 Foo是一個結構類型。當分配給某個值,作爲參數傳遞或附加到切片時,結構體將按值複製。您的append行添加複製foos,而您打算將參考添加到foo

要修復,使s指針到你的結構片:

s := make([]*Foo) 
var foo Foo 
s = append(s, &foo) 

playground link

指針看起來嚇人人誰也只在C經歷痛苦他們。在進行中,他們只是允許您控制是要複製某些內容還是傳遞參考。

+0

謝謝!這是我的問題的完美答案。 –

2

在您的示例中,您正在將foo附加到s。這按值複製foo,創建foo副本s。當您打印s時,您正在打印添加到s而不是修改後的foo陣列的新創建的(當它初始化爲0時)foo

當您切換s = append(s, foo)foo.A[0] = 42,你在做同樣的事情,但這次你看到你預期的結果,因爲你複製foo陣列,具有42到s。如果您要再次修改foofmt.Printf("%v", s[0].A)仍然會給您[42,0,0,0,0]