从包的子目录引用包中的接口

时间:2014-04-23 23:27:31

标签: go

有一个包含子目录(子包)的包,并且不能使用子包中的包定义的接口。

所以,

有包f1   创建子目录f2

f1中的

定义一个接口:

--- /f1/file1.go ---

package f1

type Miner interface {
    Foo()
}

func TheFunction( m Miner) { /* blah */ }

在f2中创建一个结构,该结构应该是f1中接口的一部分:

--- /f1/f2/file2.go ---

package f2

type Mine struct {
    i int
}
func (m *Mine) Foo() {/* blah */}

在另一个文件中,我尝试使用该包并创建Mine结构并将其作为接口Miner传递给函数:

--- ./test_file.go ---

package main

import (
    "f1"
    "f1/f2"
)

m := f2.Mine{}
f1.TheFunction(&m)

这给出了错误" f2.Mine没有实现接口f1.Miner ...想要f1.Foo()但是有f2.Foo()

希望这是有道理的。  那么,如何在子目录f2中创建一个使用f1接口的结构?

感谢,

2 个答案:

答案 0 :(得分:0)

您的软件包或目录绝对没有问题:您的f2.Mine只是没有实现Miner。只有f2.*Mine有方法Foo()

查看http://golang.org/doc/faq#methods_on_values_or_pointershttp://golang.org/ref/spec#Method_sets

答案 1 :(得分:0)

在您更新问题之后,我开始构建您的测试程序。由于test_file.go中函数之外的代码,它不是很有效,但是将它包装在main函数中允许它编译并运行而没有错误。你真的尝试过运行简化的测试用例吗?

通过进一步修改程序以将Foo方法重命名为foo,我能够引发类似于您列出的错误。在这种情况下,错误是:

./test_file.go:10: cannot use &m (type *f2.Mine) as type f1.Miner in function argument:
    *f2.Mine does not implement f1.Miner (missing f1.foo method)
        have f2.foo()
        want f1.foo()

这是因为foo不是exported identifier。由于未导出,因此只有具有f1方法的foo包中的类型才符合f1.Miner接口。

如果这是您遇到的错误,如果您希望其他包中的类型能够实现它,则需要确保该接口由导出的方法组成。