2 回答
TA贡献1719条经验 获得超6个赞
您指向结构的指针应该实现接口。通过这种方式,您可以修改其字段。
看看我是如何修改你的代码的,让它按你的预期工作:
package main
import (
"fmt"
)
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())
}
TA贡献1831条经验 获得超9个赞
简单的答案是,您将无法在以SetSomeField
您想要的方式工作的同时让结构实现您的接口。
但是,指向结构的指针将实现接口,因此更改您的Create
方法 doreturn &obj
应该可以使事情正常工作。
潜在的问题是您修改后的SetSomeField
方法不再在Implementation
. 虽然该类型*Implementation
将继承非指针接收器方法,但反之则不然。
其原因与指定接口变量的方式有关:访问存储在接口变量中的动态值的唯一方法是复制它。例如,想象以下内容:
var impl Implementation var iface IFace = &impl
在这种情况下,调用可以iface.SetSomeField
工作,因为它可以复制指针以用作方法调用中的接收者。如果我们直接在接口变量中存储一个结构体,我们需要创建一个指向该结构体的指针来完成方法调用。一旦创建了这样的指针,就可以访问(并可能修改)接口变量的动态值而无需复制它。
- 2 回答
- 0 关注
- 235 浏览
添加回答
举报