猿问

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

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


(这是项目的结构)


$GOPATH/src/gitlab.com/myname/projectdir   

├── main.go

└── db

    ├── add.go

    └── add_test.go

(这是文件的简洁变体)


数据库/添加.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)

    }

}

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


db/add.go:: 未定义:a

db/add.go:: 未定义:b


似乎在构建过程中add.go找不到a和b来自add_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在构建过程中不包括在内吗?


青春有我
浏览 135回答 3
3回答

汪汪一只猫

这就是 go 工具的工作方式。_test.go文件仅在您运行时编译go test。当一个包从另一个包中导入时,_test.go不会使用其文件中的任何代码。尝试运行go build或go install从 db 包中运行。它会失败。

皈依舞

相对路径在 Go 中很敏感。一方面,我认为您需要在它们前面加上import "./db". 另一件事是你应该在你的 $GOPATH/src 位置。试试这个:将您的文件移动到$GOPATH/src/project和$GOPATH/src/project/db目录下。./db为数据库包添加导入路径的前缀。至于 IDE,这完全取决于您使用的插件。尝试自己运行这些工具:golint、go vet、oracle等以查看实际的 go 警告和错误。

幕布斯6054654

测试功能应以 Test 开头。这就是文档所说的。func TestAdd(t *testing.T) {    result := Add(a, b)    if result != 3 {        t.Errorf("expected 3, got %d ", result)    } }
随时随地看视频慕课网APP

相关分类

Go
我要回答