从结构体中的切片中删除元素
在 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.
此外,建议使用更惯用的接收者名称,例如“guest”或“g”,而不是“self”。
以上是如何从 Go 结构体中的切片中删除元素?的详细内容。更多信息请关注PHP中文网其他相关文章!