構造体内のスライスから要素を削除する
Go では、メソッド内のレシーバー オブジェクトを変更するには、ポインター レシーバーを使用する必要があります。これは、コピーではなくオブジェクトへの参照を渡すために使用される手法で、メソッド内で行われた変更を元のオブジェクトに反映できるようにします。
次のゲスト構造体を考えてみましょう:
type Guest struct { id int name string surname string friends []int }
「友達」スライスから要素を削除するには、最初に次のコードを作成します。
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 サイトの他の関連記事を参照してください。