在函数实现中遇到了以下差异。示例 1 返回指针和示例 2 返回实际对象背后的原因是什么?
type MyInterface interface {
Func (param int) float64 //just random signature
}
//MyInterfaceImpl implements MyInterface
type MyInterfaceImpl struct {
}
//actual implementation
func (myObj *MyInterfaceImpl) Func(param int) float64 {
return float64(param)
}
例1:函数返回接口(interface)时返回指向MyInterfaceImpl
的指针
func NewMyInterface() MyInterface {
return &MyInterfaceImpl{}
}
例子2:当函数返回对象时返回MyInterfaceImpl
的实际对象
func NewMyInterfaceImpl() MyInterfaceImpl {
return MyInterfaceImpl{}
}
更新:这段代码可以编译运行
func main() {
myIf := NewMyInterface()
fmt.Printf("Hi from inteface %f\n", myIf.Func(1000))
myImpl := NewMyInterfaceImpl()
fmt.Printf("Hi from impl %f\n", myImpl.Func(100))
}
UPDATE2:问题澄清。
声明 func NewMyInterface() MyInterface
和返回指针的 return &MyInterfaceImpl{}
的有效实现(对我来说)听起来很奇怪。我希望通过 return MyInterfaceImpl{}
如果语言允许这种类型的结构,那一定是有原因的。最终,我正在寻找以下答案:“函数声明返回一个接口(interface)。因为接口(interface)有一个属性 X,所以返回一个对象没有意义,但唯一有效的选项是一个指针”。
最佳答案
尽管我不确定问题是关于代码的哪一部分,但让我解释一下代码的作用:
MyInterface
由任何具有 Func(int)float64
方法的东西实现。
*MyInterfaceImpl
有这样一个方法。但是,MyInterfaceImpl
没有(该方法有一个指针接收器)。
NewMyInterface()
因此必须返回一个指针。 MyInterfaceImpl{}
不会实现 MyInterface
。
这是否回答了您的问题?
另一个问题可能是尽管有上述情况,为什么调用 myImpl.Func(100)
仍然有效。这是因为 Go 在使用指针接收器调用其方法时会自动获取接收器的地址。
这在例如 here 中有更详细的解释。 .
关于go - 实例化具有不同函数签名的对象时函数实现的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55071358/