構造体内のスライスから要素を削除する
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 サイトの他の関連記事を参照してください。