首页 >后端开发 >Golang >为什么除非我使用指针接收器,否则我的 Go 方法不会修改实例值?

为什么除非我使用指针接收器,否则我的 Go 方法不会修改实例值?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-08 22:11:12287浏览

Why Doesn't My Go Method Modify the Instance Value Unless I Use a Pointer Receiver?

带有指针接收器的 Golang 方法

当尝试通过方法修改实例的值时,理解指针的概念至关重要接收器。在此示例中,SetSomeField 方法未按预期工作,因为其接收器不是指针类型。

为了纠正此问题,我们修改 SetSomeField 方法以接受指针接收器,如下所示:

func (i *Implementation) SetSomeField(newValue string) {
    ...
}

但是,此更改引入了一个新问题:该结构体不再实现该接口,因为 GetSomeField 方法仍然具有值receive.

解决方案在于在实现接口时使用指向结构体的指针。通过这样做,我们使该方法能够修改实际实例而不创建副本。以下是修改后的代码:

type IFace interface {
    SetSomeField(newValue string)
    GetSomeField() string
}

type Implementation struct {
    someField string
}

func (i *Implementation) GetSomeField() string {
    return i.someField
}

func (i *Implementation) SetSomeField(newValue string) {
    i.someField = newValue
}

func Create() *Implementation {
    return &Implementation{someField: "Hello"}
}

func main() {
    var a IFace
    a = Create()
    a.SetSomeField("World")
    fmt.Println(a.GetSomeField())
}

在此更新的代码中,Create 函数返回一个指向实现结构的指针,该结构实现了 IFace 接口。因此,IFace 类型的变量可以引用指向 Implement 结构体的指针,从而允许 SetSomeField 方法修改其值。

以上是为什么除非我使用指针接收器,否则我的 Go 方法不会修改实例值?的详细内容。更多信息请关注PHP中文网其他相关文章!

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