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

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

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

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
}

「友達」スライスから要素を削除するには、最初に次のコードを作成します。

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 までご連絡ください。