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))
}
更新2:问题澄清。
这听起来很奇怪(对我来说)有一个声明func NewMyInterface() MyInterface
return &MyInterfaceImpl{}
一个指针返回的声明和一个有效的实现。我希望返回 MyInterfaceImpl 的对象return MyInterfaceImpl{}
如果语言允许这种类型的结构,那肯定是有原因的。最终,我正在寻找以下答案:“函数声明返回一个接口。因为接口具有属性 X,所以返回对象没有意义,但唯一有效的选项是指针”。
解决方案
尽管我不确定问题是关于代码的哪一部分,但让我解释一下代码的作用:
MyInterface
由任何有Func(int)float64
方法的东西实现。
*MyInterfaceImpl
有这样的方法。但是,MyInterfaceImpl
没有(该方法有一个指针接收器)。
NewMyInterface()
因此必须返回一个指针。MyInterfaceImpl{}
不会实施MyInterface
。
这回答了你的问题了吗?
另一个问题可能是为什么呼叫myImpl.Func(100)
有效,尽管有上述情况。这是因为Go在使用指针接收器调用其方法时会自动获取接收器的地址。
例如这里更详细地解释了这一点。
推荐阅读
- python - 在 Data Pipeline 中训练测试数据集
- json - npm start 时出错:作者问题
- laravel - Laravel 将参数传递给 api 资源
- javascript - 反应路由器相对路径到静态文件未正确加载
- angular - Angular canActivate 重定向以登录浏览器刷新 Firebase
- javascript - 将 JavaScript 迁移到 TypeScript
- rpmbuild - 使用 Developer Toolset 7 时,RPM 构建无法定位 libelf.so.dts.1
- spring - 将 Spring MVC 转换为 Spring Boot 应用程序。是否可行且值得?
- php - Laravel Routes not working 404 not found
- c# - 如何修复 SCS0018?