带有指针接收器的 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中文网其他相关文章!