带有MyImplementation的MyInterface在库的单独文件中

时间:2017-03-09 02:32:28

标签: go interface

项目结构需要在单独的文件中定义接口和实现。

最好下载一个小的隔离测试用例来获取图片,但这里也是代码。它是一个库项目,这就是为什么mylib被声明为每个文件的包。我想要有子包但golang不允许这样做,所以我将所有内容放在一个包中,而文件放在不同的目录中。

Download Test Project

的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")
}

问题

  1. 如何声明MyInterface的类型并为其分配MyImplementation的对象。

  2. 如何在实施文件中导入和界面

  3. 自动完成IDE会在导入界面类型时自动将其置于导入状态。不知道为什么。 mylib2 "interfaces"。我知道它是别名,但为什么我们需要别名呢?

  4. 帮助修复implementation_test中的代码

1 个答案:

答案 0 :(得分:0)

  1. 您已在MyInterface内声明了src/interfaces/my_interface.go的类型。您不必重新声明它,也不必将MyImplementation显式指定给接口。所有你必须确保你的MyImplementation实现界面中的所有方法。只要两个文件位于同一个包和相同的文件夹级别,您的实现就会自动成为您的界面。

  2. 只要它们都在同一个包和文件夹中,您就不必在实现中导入界面

  3. 撰写本文时,Gogland正处于早期访问计划中,这只是BETA的另一个名称:)。我不认为SO允许评论测试中的任何内容。遗憾。

  4. 修改

    1. 根据您的代码结构,在尝试使用子文件夹时,您采用了错误的方法。如果您使用的是子文件夹,那么这些子文件夹应该是独立的包。所以我们说你的GOPATH是~/go。您需要这样的结构:~/go/src/github.com/user/mylib。因此,如果你想要一个子文件夹/子包,你会有类似这样的~/go/src/github.com/user/mylib/util,而util将是它自己的包。尝试将实现放在一个文件夹中并将接口放在另一个文件夹中是错误的。而是将它们逻辑分组并创建子包。然后在你的测试中你可以像这样使用它们:
    2. import(
        "github.com/user/mylib"
        "github.com/user/mylib/util"
      )
      
      如果您正在编写可以在任何项目中重复使用的库,那么github.com或任何其他repo服务都很重要。

      除此之外,我建议使用更稳定的IDE或编辑器。

      希望这有帮助