Go 生成期间包中未定义的变量

Go 生成期间包中未定义的变量,go,Go,我在一个名为db的包中有两个文件,其中一个文件定义了几个未报告的变量。另一个是测试文件,需要使用以下变量: (这是项目的结构) (以下是文件的简短变体) 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` package db import ( "testing" ) var (

我在一个名为
db
的包中有两个文件,其中一个文件定义了几个未报告的变量。另一个是测试文件,需要使用以下变量:

(这是项目的结构)

(以下是文件的简短变体)

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`
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)
    }
}
package main

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

func main() {
    res := db.Add(1, 2)
    fmt.Println(res)
}
db/add\u测试开始

package db

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

// some other functions that use a and b from `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)
    }
}
package main

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

func main() {
    res := db.Add(1, 2)
    fmt.Println(res)
}
db/
目录中运行
go-test
已通过,但一旦我运行
go-run main-go
它就会产生以下错误:

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

似乎
add.go
在构建过程中无法从
add\u test.go
中找到
a
b

main.go

package db

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

// some other functions that use a and b from `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)
    }
}
package main

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

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

这是因为在构建过程中不包括
add\u test.go

在go中相对路径是敏感的。首先,我认为您需要在它们前面加上
import./db“
。另一件事是,您应该位于$GOPATH/src位置

试试这个:

  • 将文件移动到
    $GOPATH/src/project
    $GOPATH/src/project/db
    目录下
  • 为db包的导入路径添加前缀
    /db

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

这就是go工具的工作方式

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


尝试从db包内部运行
go build
go install
。它将失败。

测试功能应以测试开始。这就是文件所说的

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

干杯。

我不太明白你的建议。您是否建议我在
db
中的每个文件中使用相对导入,如
/db
?您的代码示例不完整。我假设
projectDir
是一个
package main
运行时,因此您的
go run main.go
语句。它就在这个
main.go
(以及这个
main
包中的任何其他东西)中,它将引用您的数据库代码和
import./db”
。另外,请确保所有内容都在您的
$GOPATH/src/
中。很抱歉,我添加了项目结构以获得更多澄清。啊,我明白了。关于引用本地软件包的另一件事:如果您不断修改该软件包,则需要使用
继续刷新它,安装gitlab.com/myname/projectdir/db
go build
工具对导入页面进行一些缓存。运行
go install
将强制刷新该包的缓存。试试看,让我知道。还是不行。另外,当我刚刚在
db
目录中运行
go build
时,也发生了相同的错误。