实例化具有不同功能签名的对象时,功能实现上的差异

时间:2019-03-08 21:38:02

标签: go

实现以下不同之处的是函数实现。示例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{}

的MyInterfaceImpl对象

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

1 个答案:

答案 0 :(得分:1)

即使我不确定问题涉及的代码的哪一部分,也让我解释一下代码的作用:

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

NewMyInterface()因此必须返回一个指针。 MyInterfaceImpl{}无法实现MyInterface

这能回答您的问题吗?


尽管存在上述问题,另一个问题可能是为什么呼叫myImpl.Func(100)起作用。这是因为 Go 在使用指针接收器调用其方法时会自动获取接收器的地址。
例如,here对此进行了详细说明。

相关问题