我在 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() 字符串
我不明白这里的错误是什么。看起来不像是实现接口时的一个简单错误。