在一个包中定义的接口在不同的包中不起作用

gig*_*lis 1 interface go

我在 goQA 包中定义了一个简单的接口,并将其与实现该接口的结构体一起使用:

type ReportWriter interface {
    Name() string
    Init(parent ITestManager)
    onManagerStatistics(report *ManagerResult, stats *ReporterStatistics, name, msg string)
}


type MongoReporter struct {
}

func (t *MongoReporter) Name() string {
}

func (t *MongoReporter) Init(parent ITestManager) {
}

func (t *MongoReporter) onManagerStatistics(report *ManagerResult, stats *ReporterStatistics, name, msg string) {
}
Run Code Online (Sandbox Code Playgroud)

然后我可以在示例文件中创建一个变量,一切正常:

var mr goQA.ReportWriter
mr = &goQA.MongoReporter{}
Run Code Online (Sandbox Code Playgroud)

当将结构移动到它自己的包 mongo 并导入 goQA 包时,问题就出现了。除了使用包名称之外,一切都相同:

type MongoReporter struct {
}

func (t *MongoReporter) Name() string {
}

func (t *MongoReporter) Init(parent goQA.ITestManager) {
}

func (t *MongoReporter) onManagerStatistics(report *goQA.ManagerResult, stats *goQA.ReporterStatistics, name, msg string) {
}
Run Code Online (Sandbox Code Playgroud)

我尝试像以前一样在示例程序中使用结构:

var mr goQA.ReportWriter
mr = &mongo.MongoReporter{}
Run Code Online (Sandbox Code Playgroud)

有错误信息:

""""examples\example_mongo1.go:108: 无法在赋值中使用 mongo.MongoReporter 文字(类型 *mongo.MongoReporter)作为 oQA.ReportWriter 类型:*mongo.MongoReporter 未实现 goQA.ReportWriter (缺少 goQA.onManagerStatistics 方法)有 mongo.onManagerStatistics(*goQA.ManagerResult, *goQA.ReporterStatistics, string, string) 想要 goQA.onManagerStatistics(*goQA.ManagerResult, *goQA.ReporterStatistics, string, string)""""

为什么它说“有 mongo.onManagerStatistics 但想要 goQA.onManagerStatistics?” 签名不一样吗?为什么不抱怨 Init() 和 Name() 方法呢?

将 Name() string 方法更改为 Name(i int) string 后,错误为

有 Name(int) 字符串 想要 Name() 字符串

没有说:

有 mongo.Name(int) 字符串 想要 goQA.Name() 字符串

我不明白这里的错误是什么。看起来不像是实现接口时的一个简单错误。

Vol*_*ker 5

包 B 如何提供一个类型来实现包 A 的接口,而包 A 具有未导出的方法?确切地说:不能。您必须onManagerStatistics以大写 O导出。