项目结构需要在单独的文件中定义接口和实现。
最好下载一个小的隔离测试用例来获取图片,但这里也是代码。它是一个库项目,这就是为什么mylib
被声明为每个文件的包。我想要有子包但golang不允许这样做,所以我将所有内容放在一个包中,而文件放在不同的目录中。
的src /接口/ my_interface.go
package mylib
type MyInterface interface {
foo()
bar()
}
src / interfaces / my_implementation.go 如何在这里导入界面?
package mylib
type MyImplementation struct {}
// possible to declare *MyInteface here?
func (imp *MyImplementation) foo() {}
func (imp *MyImplementation) bar() {}
测试/实现方式/ implementation_test.go
package implementations
import (
"testing"
"fmt"
"implementations"
mylib2 "interfaces" // why mylib2 here?
)
func TestImplementation(t *testing.T) {
// how to declare variable of type `MyInterface` and assign an object `MyImplementation` to it
interface_type_var := mylib2.MyInterface() // error
interface_type_var := mylib.MyImplementation{} // error
fmt.Println("Test successful")
}
问题
如何声明MyInterface的类型并为其分配MyImplementation的对象。
如何在实施文件中导入和界面
自动完成IDE会在导入界面类型时自动将其置于导入状态。不知道为什么。 mylib2 "interfaces"
。我知道它是别名,但为什么我们需要别名呢?
帮助修复implementation_test
中的代码
答案 0 :(得分:0)
您已在MyInterface
内声明了src/interfaces/my_interface.go
的类型。您不必重新声明它,也不必将MyImplementation
显式指定给接口。所有你必须确保你的MyImplementation
实现界面中的所有方法。只要两个文件位于同一个包和相同的文件夹级别,您的实现就会自动成为您的界面。
只要它们都在同一个包和文件夹中,您就不必在实现中导入界面
撰写本文时,Gogland正处于早期访问计划中,这只是BETA的另一个名称:)。我不认为SO允许评论测试中的任何内容。遗憾。
修改强>
~/go
。您需要这样的结构:~/go/src/github.com/user/mylib
。因此,如果你想要一个子文件夹/子包,你会有类似这样的~/go/src/github.com/user/mylib/util
,而util将是它自己的包。尝试将实现放在一个文件夹中并将接口放在另一个文件夹中是错误的。而是将它们逻辑分组并创建子包。然后在你的测试中你可以像这样使用它们:import(
"github.com/user/mylib"
"github.com/user/mylib/util"
)
如果您正在编写可以在任何项目中重复使用的库,那么github.com或任何其他repo服务都很重要。
除此之外,我建议使用更稳定的IDE或编辑器。
希望这有帮助