Go でのスライス操作を理解する
Go では、構造体のプロパティとしてスライスを操作するとき、値の受け渡しを考慮することが重要です。特定の状況では、メソッド内のスライスへの追加が失敗したように見える場合があります。この背後にある理由を詳しく調べて、解決策を探ってみましょう。
Go 構造体での値の受け渡し
Go では、すべてが値によって渡されます。つまり、コピーが作成されます。渡された値ごとに。その結果、メソッド内でコピーに加えられた変更は、元の値には影響しません。
テスト 3: 失敗した追加試行
次のコードを検討してください。
type Test3 struct { all []int } func (c Test3) run() []int { c.combo() return c.all } func (c Test3) combo() { for i := 0; i < 2; i++ { c.all = append(c.all, i) fmt.Println("Test3 step", i + 1, c.all) } }
Test3.run() を呼び出すと、c.all は変更されていないように見えます。これは、 combo() メソッドが Test3 のコピーに対して動作し、 combo() 内で行われた変更が元の値に反映されないためです。
解決策: ポインター レシーバーの使用
この問題を解決するには、combo() のポインター レシーバーを使用します。 Method:
func (c *Test3) combo() { for i := 0; i < 2; i++ { c.all = append(c.all, i) fmt.Println("Test3 step", i + 1, c.all) } }
ポインター レシーバーを使用すると、combo() が元の Test3 値を変更し、メソッドが返されたときに変更が反映されるようになります。
以上がGo Struct メソッドでのスライスへの追加が常に機能しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。