首页  >  文章  >  后端开发  >  为什么使用值接收器会导致 Go 结构体中的切片修改不正确?

为什么使用值接收器会导致 Go 结构体中的切片修改不正确?

Patricia Arquette
Patricia Arquette原创
2024-11-17 05:03:03971浏览

Why Does Using a Value Receiver Lead to Incorrect Slice Modification in a Go Struct?

从结构体中的切片中删除元素(已解决)

在提供的代码片段中,尝试删除使用值接收器从结构内的切片中获取元素。这会导致原始结构体中切片的错误修改。

要解决此问题,必须在修改切片的方法中使用指针接收器。这是因为 Go 值接收器会创建接收器值的副本,这意味着方法中对接收器所做的任何更改都不会反映在原始结构中。

以下是更正后的代码:

func (guest *Guest) removeFriend(id int) {
    for i, other := range guest.friends {
        if other == id {
            guest.friends = append(guest.friends[:i], guest.friends[i+1:]...)
            break
        }
    }
}

通过使用指针接收器 (*Guest),该方法修改原始 Guest 结构体的友元切片,确保元素被正确删除。

说明:

当按值传递切片时,接收器方法对切片的副本进行操作。对切​​片进行修改时,它们仅反映在副本中,而不反映在原始切片中。但是,使用指针接收器允许该方法修改原始切片,因为接收器现在是指向原始结构的指针。

用法示例:

guest := &Guest{
    id:      1,
    name:    "Bob",
    surname: "Pats",
    friends: []int{1, 2, 3, 4, 5},
}

fmt.Println(guest)
guest.removeFriend(3)
fmt.Println(guest)

输出:

&{1 Bob Pats [1 2 3 4 5]}
&{1 Bob Pats [1 2 4 5]}

以上是为什么使用值接收器会导致 Go 结构体中的切片修改不正确?的详细内容。更多信息请关注PHP中文网其他相关文章!

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