Go语言main包为何无法直接调用封装了方法集的公共interface?
问题原因
- 错误1:你直接把
a.MyFunc接口类型当静态类调用了方法,Go里接口的方法是实例绑定的,必须先获取实现了该接口的结构体实例,再通过实例调用方法,不能直接通过接口类型调用。 - 错误2:你定义的实现类
myFunction是小写开头的私有类型,包外(main.go里)无法直接初始化这个结构体,必须在a包内提供对外的构造方法返回接口实例。 - 补充:你直接调用
a.MyFunc.Create()的时候,Go会把方法的第一个参数认作接口实例本身,所以才会提示你参数不足,且要求你传入MyFunc类型的第一个参数,和你传的*MyData类型不匹配,就是第二个报错的来源。
修复方案
第一步:修改a包的a.go代码,新增对外构造方法
package a type myFunction struct{} type MyFunc interface { Create(myData *MyData) (*MyData, error) Fetch(test string) Delete(test string) } // 新增对外构造方法,返回MyFunc接口实例 func NewMyFunc() MyFunc { return &myFunction{} } // 原有方法保持不变 func (a *myFunction) Create(data *MyData) (*MyData, error) { return nil, nil } func (a *myFunction) Fetch(test string) { } func (a *myFunction) Delete(test string) { }
第二步:修改main.go的调用逻辑
// 先构造MyData data := &a.MyData{ // 你的赋值逻辑 } // 先获取a包的接口实例 myFuncIns := a.NewMyFunc() // 再通过实例调用Create方法 result, err := myFuncIns.Create(data)
内容的提问来源于stack exchange,提问作者gbubemi smith
相关产品推荐
相关产品推荐

