有一个包含子目录(子包)的包,并且不能使用子包中的包定义的接口。
所以,
有包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接口的结构?
感谢,
答案 0 :(得分:0)
您的软件包或目录绝对没有问题:您的f2.Mine
只是没有实现Miner
。只有f2.*Mine
有方法Foo()
。
查看http://golang.org/doc/faq#methods_on_values_or_pointers和http://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
接口。
如果这是您遇到的错误,如果您希望其他包中的类型能够实现它,则需要确保该接口由导出的方法组成。