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

时间:2014-04-24 18:52:16

标签: 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) {
}

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

var mr goQA.ReportWriter
mr = &goQA.MongoReporter{}

将结构移动到它自己的包,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) {
}

我尝试在之前的示例程序中使用struct:

var mr goQA.ReportWriter
mr = &mongo.MongoReporter{}

有错误消息:

“”“”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()字符串方法更改为Name(i int)字符串后,错误为

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

没说:

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

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

1 个答案:

答案 0 :(得分:3)

包B如何提供一种类型,它满足包含未导出方法的包A的接口?确切地说:它不能。您必须使用大写O <。

导出onManagerStatistics