实现以下不同之处的是函数实现。示例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:当函数返回接口时,返回指向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{}
如果语言允许这种类型的构造,则一定有原因。最终,我正在寻找以下答案:“函数声明返回一个接口。因为该接口具有属性X,所以返回对象是没有意义的,但是唯一的有效选项是指针”。
答案 0 :(得分:1)
即使我不确定问题涉及的代码的哪一部分,也让我解释一下代码的作用:
MyInterface
由具有Func(int)float64
方法的任何东西实现。
*MyInterfaceImpl
有这种方法。但是,MyInterfaceImpl
没有(该方法具有指针接收器)。
NewMyInterface()
因此必须返回一个指针。 MyInterfaceImpl{}
无法实现MyInterface
。
这能回答您的问题吗?
尽管存在上述问题,另一个问题可能是为什么呼叫myImpl.Func(100)
起作用。这是因为 Go 在使用指针接收器调用其方法时会自动获取接收器的地址。
例如,here对此进行了详细说明。