構造体内のスライスからの要素の削除
Go では、メソッド内のレシーバー オブジェクトを変更するには、ポインター レシーバーを使用する必要があります。これは、コピーではなくオブジェクトへの参照を渡すために使用される手法で、メソッド内で行われた変更を元のオブジェクトに反映できるようにします。
次のゲスト構造体を考えてみましょう:
type Guest struct { id int name string surname string friends []int }
「friends」スライスから要素を削除するには、最初に次のコードを作成します。
func (self Guest) removeFriend(id int) { for i, other := range self.friends { if other == id { self.friends = append(self.friends[:i], self.friends[i+1:]...) break } } }
ただし、このコードは、「removeFriend」メソッドで次のコードが使用されるため、期待どおりに要素を削除できません。ポインタレシーバの代わりに値レシーバを使用します。その結果、メソッド内の「friends」スライスに加えられた変更は、元のオブジェクトには反映されません。
この問題を修正するには、ポインタ レシーバを使用するように「removeFriend」メソッドを修正する必要があります。
func (self *Guest) removeFriend(id int) { // Same logic as before }
ポインター レシーバーを使用することにより、メソッドはコピーではなく元のオブジェクトを変更するようになりました。その結果、メソッド内の「friends」スライスに加えられた変更は、元の Guest オブジェクトに正常に反映されます。
以上がGo 構造体内のスライスから要素を削除するためにポインター レシーバーが必要なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。