构建期间包中的未定义变量

时间:2016-04-15 04:14:12

标签: go

我在一个名为db的包中有两个文件,其中一个包含一些未导出的变量。另一个是测试文件,需要使用这些变量:

(这是项目的结构)

$GOPATH/src/gitlab.com/myname/projectdir   
├── main.go
└── db
    ├── add.go
    └── add_test.go

(这是文件的简洁变体)

分贝/ add.go

package db

func Add(x, y int) int {
    return x + y
}

// some other functions that use a and b from `add_test.go`

分贝/ add_test.go

package db

import (
    "testing"
)

var (
    a = 1
    b = 2
)

// test function use variables from add.go
func testAdd(t *testing.T) {
    result := add(a, b)
    if result != 3 {
        t.Error(err)
    }
}

go test目录中运行db/,但是一旦我运行go run main go,就会产生以下错误:

  

db / add.go :: undefined:a   db / add.go :: undefined:b

在构建过程中,add.go似乎无法从a找到badd_test.go

main.go

package main

import (
    "fmt"
    "gitlab.com/myname/projectdir/db"
)

func main() {
    res := db.Add(1, 2)
    fmt.Println(res)
}

这是因为在构建过程中未包含add_test.go吗?

3 个答案:

答案 0 :(得分:2)

这就是go工具的工作方式。

只有在您运行_test.go时才会编译

go test个文件。从另一个包导入包时,不会使用其_test.go文件中的任何代码。

尝试从db包中运行go buildgo install。它会失败。

答案 1 :(得分:1)

Go中的相对路径很敏感。首先,我认为你需要在import "./db"前添加前缀。另一件事是你应该在你的$ GOPATH / src位置。

试试这个:

  • 将您的文件移至$GOPATH/src/project$GOPATH/src/project/db目录。
  • 为导入路径添加./db作为数据包包的前缀。

对于IDE,这完全取决于您使用的任何插件。尝试自己运行这些工具:golintgo vetoracle等,以查看实际的警告和错误。

答案 2 :(得分:0)

测试功能应从Test开始。这就是文档所说的内容。

func TestAdd(t *testing.T) {
    result := Add(a, b)
    if result != 3 {
        t.Errorf("expected 3, got %d ", result)
    }
 }

干杯。