首页 > 解决方案 > 实例化具有不同函数签名的对象时函数实现的差异

问题描述

遇到以下不同的函数实现。示例 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))
}

更新2:问题澄清。

这听起来很奇怪(对我来说)有一个声明func NewMyInterface() MyInterfacereturn &MyInterfaceImpl{}一个指针返回的声明和一个有效的实现。我希望返回 MyInterfaceImpl 的对象return MyInterfaceImpl{}

如果语言允许这种类型的结构,那肯定是有原因的。最终,我正在寻找以下答案:“函数声明返回一个接口。因为接口具有属性 X,所以返回对象没有意义,但唯一有效的选项是指针”。

标签: go

解决方案


尽管我不确定问题是关于代码的哪一部分,但让我解释一下代码的作用:

MyInterface由任何有Func(int)float64方法的东西实现。
*MyInterfaceImpl有这样的方法。但是,MyInterfaceImpl没有(该方法有一个指针接收器)。

NewMyInterface()因此必须返回一个指针。MyInterfaceImpl{}不会实施MyInterface

这回答了你的问题了吗?


另一个问题可能是为什么呼叫myImpl.Func(100)有效,尽管有上述情况。这是因为Go在使用指针接收器调用其方法时会自动获取接收器的地址。
例如这里更详细地解释了这一点。


推荐阅读