go - 实例化具有不同函数签名的对象时函数实现的差异

标签 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:函数返回接口(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{}

返回 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/

相关文章:

go - 如何使用golang在请求 header 中保持关键大小写敏感?

file - go) 我如何提供下载服务?

amazon-web-services - 如何将 AWS GO SDK 与 RESTful API 结合使用?

go - 两个 gob 编码器产生不同的结果

go - 为什么 golang 范围运算符是通过声明局部变量来实现的?

string - 如何检查golang模板中字符串的空值

go - 封闭 channel 与零 channel

mongodb - 我们将如何根据结果数以及计数字段输入数据?

go - 如何在 tcp 客户端中停止 io.Copy(file, conn)?

go - package code.google.com/p/go.example/hello : exec: "hg": executable file not found in %PATH%. 如何获取远程golang包?