首页  >  文章  >  后端开发  >  如何从 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.

此外,建议使用更惯用的接收者名称,例如“guest”或“g”,而不是“self”。

以上是如何从 Go 结构体中的切片中删除元素?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn