【问题标题】:refer to interface in package from subdirectory of package从包的子目录引用包中的接口
【发布时间】:2014-04-25 08:49:30
【问题描述】:

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

所以,

有包 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 接口的结构?

谢谢,

【问题讨论】:

  • 您发布的代码在语法上不正确(例如,将类型分配给变量 m)。你能发布一个完整的例子吗?

标签: go


【解决方案1】:

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

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

【讨论】:

  • 我写错了,对象在我的代码中作为指针传递,所以应该是:TheFunction(&m)。我仍然有同样的错误。
  • 我不认为问题与指针有关,但因为结构是在包 f2 中定义的,所以它抱怨你有 f2.Foo() 但想要 f1.Foo()。为什么我可以将类型 oi.Reader 接口方法传递给结构,但这是在抱怨,因为接口在不同的范围内?
【解决方案2】:

在您更新问题后,我开始构建您的测试程序。由于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 接口。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 2018-02-15
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多