【问题标题】:Undefined Variables Within a Package During Build构建期间包内的未定义变量
【发布时间】:2016-04-16 08:18:12
【问题描述】:

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

(这是项目的结构)

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

(这是文件的简洁变体)

db/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`

db/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)
    }
}

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

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

好像add.go 在构建过程中无法从add_test.go 中找到a 和b。

ma​​in.go

package main

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

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

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

【问题讨论】:

    标签: go


    【解决方案1】:

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

    _test.go 文件仅在您运行 go test 时编译。从另一个包导入一个包时,不会使用其_test.go 文件中的任何代码。

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

    【讨论】:

      【解决方案2】:

      相对路径在 Go 中很敏感。一方面,我认为您需要在它们前面加上import "./db"。另一件事是你应该在你的 $GOPATH/src 位置。

      试试这个:

      • 将您的文件移动到$GOPATH/src/project 和$GOPATH/src/project/db 目录下。
      • 为 DB 包添加 ./db 前缀。

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

      【讨论】:

      • 不确定我是否理解您的建议。您是否建议我在db 中的每个文件中使用./db 之类的相对导入?
      • 您的代码示例不完整。我假设 projectDir 是 package main 运行时,因此您的 go run main.go 声明。它在这个main.go(以及这个main 包中的任何其他内容)中,它将使用import "./db" 引用您的数据库代码。并且,请确保所有内容都在您的 $GOPATH/src/ 中。
      • 抱歉,我已添加项目结构以进行更多说明。
      • 啊,我明白了。关于引用本地包的另一件事:如果您不断修改该包,则需要使用go install gitlab.com/myname/projectdir/db 不断刷新它。 go build 工具对导入页面进行一些缓存。运行go install 会强制刷新该包的缓存。试试看,让我知道。
      • 还是不行。另外,当我刚刚在db 目录中运行go build 时,发生了同样的错误。
      【解决方案3】:

      测试函数应该以 Test 开头。这就是文档所说的。

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

      干杯。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-18
        • 1970-01-01
        • 2016-07-05
        • 2021-08-25
        • 2015-08-13
        • 1970-01-01
        • 2012-10-20
        相关资源
        最近更新 更多