Go - 構造体のスライスへの追加
Go では、構造体内のスライスに追加する場合、変数の参照に注意する必要があります。これは、構造体内でスライスを操作する場合、特に構造体を受け取るメソッドがポインタ レシーバである場合に混乱を招く可能性があります。
問題
次のコードを考えてみましょう。
package main import "fmt" type MyBoxItem struct { Name string } type MyBox struct { Items []MyBoxItem } func (box *MyBox) AddItem(item MyBoxItem) []MyBoxItem { return append(box.Items, item) } func main() { item1 := MyBoxItem{Name: "Test Item 1"} box := MyBox{[]MyBoxItem{}} // Initialize box with an empty slice AddItem(box, item1) // This is where the problem arises fmt.Println(len(box.Items)) }
この問題は、AddItem メソッドの呼び出しで発生します。メソッドを box.AddItem(item1) ではなく AddItem(box, item1) として呼び出すと、元のボックス構造体を変更するのではなく、ボックス構造体の新しいコピーが作成されます。
Solution
これを解決するには、AddItem メソッドの結果を元のスライスに割り当てます。 struct:
func (box *MyBox) AddItem(item MyBoxItem) { box.Items = append(box.Items, item) }
これを行うと、AddItem メソッド内のスライスに加えられた変更が、構造体の元のスライス フィールドに反映されます。
メイン関数の改訂
更新された AddItem メソッドでは、修正された main 関数は次のようになります。 be:
func main() { item1 := MyBoxItem{Name: "Test Item 1"} box := MyBox{[]MyBoxItem{}} box.AddItem(item1) // Call the method correctly fmt.Println(len(box.Items)) }
これで、出力には Items スライスの長さが正しく表示されます。項目を追加した後は 1 になるはずです。
以上がGo 構造体内のスライスに正しく追加するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。