Golang上的包导入错误

时间:2017-07-03 10:17:17

标签: go

我的帖子有2个问题

我基本上是想了解如何将gomock与gingko一起使用

GOPATH

/Users/Ratatouille/Desktop/test/goExample

以下项目位于

/Users/Ratatouille/Desktop/test/goExample/square

具有以下项目结构

.
├── area.go
└── area_test
    ├── area_mock.go
    ├── area_mock_test.go
    └── area_suite_test.go

我无法理解为什么我会收到以下错误

Failed to compile area_test:

can't load package: package ./area_test: found packages area_test (area_mock.go) and area (area_mock_test.go) in /Users/Ratatouille/Desktop/test/goExample/square/area_test

Ginkgo ran 1 suite in 303.243871ms
Test Suite Failed

我的第二个问题是项目回购有像这样的area.go文件

package main

import "fmt"

type Square struct {
    side float32
}

func (s *Square) Area() float32 {
    return s.side * s.side
}

func (s *Square) CalculateArea(shaper Shaper) float32 {
    shaper.Area()
}

type Shaper interface {
    Area() float32
}

func main() {
    sq1 := new(Square)
    sq1.side = 2

    var areaIntf Shaper
    areaIntf = sq1
    fmt.Println(areaIntf.Area())
}

我的问题是如何导入 mainarea_mock_test.go

1 个答案:

答案 0 :(得分:2)

您的项目结构不是Go所期望的。

area_test/不是area的测试。我猜猜你跑了go test ./area_test。这告诉Go ./area_test是一个项目。它尝试编译area_mock.go并尝试使用area_mock_test.goarea_suite_test.go作为测试。你得到的错误是告诉你它不希望在项目文件中找到一个名为*_test的包的尴尬方式。

area.go也是一个问题。您可以使用package main,但然后尝试使用package area_test进行测试。他们不匹配,Go不会喜欢它。包目录包含 一个包 。其测试必须使用该包或thatpackage_test。这强制包目录做一件事。它要么是要导入的库,要么是要运行的程序。不是两个。

项目目录也称为square,但程序包为area。可以使文件与项目名称不匹配,并且可以在一个包中包含多个文件,但是使用包而不是项目目录名是不好的做法。

还有另一个问题。 Go期望源文件位于$GOPATH/src。您可以直接在$GOPATH中找到它们。导入语句无法找到它们。

Go的项目结构可能需要一些时间来适应,并且它对如何构建项目和包有非常坚定的想法(Go对如何编写代码以及如何编写代码有非常坚定的想法它不是。不要打它。帮自己一个忙,并使用GOPATH的默认~/go并将您的代码放入~/go/src/

您可以像这样编写方形库。

~/go/src/square/
|--- square.go
|--- square_test.go

square.go可能看起来像这样。

package square

type Square struct {
    Side float32
}

func (s Square) Area() float32 {
    return s.Side * s.Side
}

请注意,Side必须大写才能成为公共数据成员。还要注意它传递的值,在Go中,如果你打算修改结构,那么它只能通过指针传递。

square_test.go可能看起来像这样。

package square_test

import(
    "testing"
    "square"
    "github.com/stvp/assert"
)

func TestArea( t *testing.T ) {
    sq := square.Square{Side: 5}

    assert.Equal( t, sq.Area(), float32(25) )
}

Go没有任何断言。 github.com/stvp/assert提供了基础知识并消除了大量乏味。你可以使用go get github.com/stvp/assert获得它。

请注意,它是package square_test使其成为黑盒测试,只能使用square的公共接口。如果你想要一个玻璃盒/内部测试,它将使用package square并进入自己的文件,如square_internal_test.go

如果你想要一个使用square的程序,它将在它自己独立的包目录中。它会main.go package mainimport "square"

How To Write Go更详细地解释了这一点。