2016-12-13 8 views
0

golang構造体があり、そこに1つのエントリを変更したいとします。golangの構造体であるスライス要素を変更するにはどうすればよいですか?

type Type struct { 
    value int 
} 

func main() { 

    s := []Type{{0}, {0}} 

    // Prints [{0} {0}] 
    fmt.Println(s) 

    firstEntry := s[0] 
    firstEntry.value = 5 

    // Also prints [{0} {0}] 
    fmt.Println(s) 
} 

https://play.golang.org/p/32tpcc3-OD

ブラケット演算子を使用して、その戻り、スライス自体を変更しない変更します。

このスライスエントリの変更を行う推奨方法は何ですか?

+0

はちょうどマップ S [0] = firstEntry に戻しますか、常に値によって渡された移動にポインタ –

答えて

2

これは、スライスのバッキングストアに取得

s[0].value = 5 

を試してみてください。また

p := &s[1] 
p.value = 6 
-2

golangのスライスのブラケット演算子は、値で返されます。

私は、参照が返されるセマンティクスのようなC++のstlベクトルを想定していました。 (http://en.cppreference.com/w/cpp/container/vector/operator_at

変更された値をスライスインデックスに戻す必要があります。

type Type struct { 
    value int 
} 

func main() { 

    s := []Type{{0}, {0}} 

    // Prints [{0} {0}] 
    fmt.Println(s) 

    firstEntry := s[0] 
    firstEntry.value = 5 

    // Prints [{0} {0}] 
    fmt.Println(s) 

    s[0] = firstEntry 

    // Prints [{5} {0}] 
    fmt.Println(s) 
} 

https://play.golang.org/p/dMKqNgMda3

+3

すべてを使用しています。なぜ物事を仮定する? – Volker

関連する問題