ホームページ  >  記事  >  バックエンド開発  >  Goで構造体内のスライスから要素を削除するにはどうすればよいですか?

Goで構造体内のスライスから要素を削除するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-14 16:29:02439ブラウズ

How to Remove Elements from a Slice Within a Struct in Go?

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

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
        }
    }
}

このコードは、「Guest」構造体の「friends」スライスから要素を削除します。ただし、元の構造体から要素を削除しようとすると、次の例に示すように、目的の要素が上書きされ、最後の要素が乗算されます。

guest1.friends = [1, 2, 3, 4, 5]
guest1.removeFriend(3)
// Result: guest1.friends = [1, 2, 4, 5, 5]

この問題を修正するには、ポインタ レシーバを使用する必要があります。

func (self *Guest) removeFriend(id int) {
    // ... (Same implementation)
}

ポインター レシーバーを使用することにより、新しいスライス値 ("append()" によって返される) を元の "Guest" 構造体の "friends" フィールドに割り当て、スライスの長さを効果的に削減します。 1.

さらに、「self」の代わりに「guest」や「g」など、より慣用的な受信者名を使用することをお勧めします。

以上がGoで構造体内のスライスから要素を削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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