ホームページ >バックエンド開発 >Golang >Go 構造体内のスライスから要素を削除するためにポインター レシーバーが必要なのはなぜですか?

Go 構造体内のスライスから要素を削除するためにポインター レシーバーが必要なのはなぜですか?

DDD
DDDオリジナル
2024-11-15 11:43:02743ブラウズ

Why Do I Need a Pointer Receiver to Remove Elements from a Slice within a Go Struct?

構造体内のスライスからの要素の削除

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。