奇怪的golang包导入问题

7

这是目录树:

+/project  
  +---/bin  
  +---/pkg  
  +---/src  
    +---/client_test  
      +---client_test.go  
    +---main.go  

在 main.go 文件中:
package main
import ("client_test")
func main() {
  client_test.Send()
}

在client_test.go文件中:
package client_test
func Send() {
}

错误:

src/main.go|8| imported and not used: "client_test"
src/main.go|32| undefined: client_test

我已经阅读了如何在golang中使用自定义包?,我认为我像这个人一样有相同的解决方案,但我不知道如何解决这个问题。请帮忙。

go环境变量:

GOARCH="amd64"  
GOBIN="/usr/local/go/bin"  
GOCHAR="6"  
GOEXE=""  
GOGCCFLAGS="-g -O2 -fPIC -m64 -pthread -fno-common"  
GOHOSTARCH="amd64"  
GOHOSTOS="darwin"  
GOOS="darwin"  
GOPATH="/Users/staff/projects/Minigame_Server" (that's exactly my working directory)  
GOROOT="/usr/local/go"  
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"  
CGO_ENABLED="1"  

你的$GOPATH是什么?或者更好的方式是输出go env是什么? - zzzz
import 会从 $GOPATH 中提取的每个“工作区”开始查找指定的路径。根据您的目录结构,我猜测您的 $GOPATH 必须包含 /some/path/to/project,也就是说,它必须包括该“project”目录。请问您的情况是否符合这种情况? - kostix
OARCH="amd64" GOBIN="/usr/local/go/bin" GOCHAR="6" GOEXE="" GOGCCFLAGS="-g -O2 -fPIC -m64 -pthread -fno-common" GOHOSTARCH="amd64" GOHOSTOS="darwin" GOOS="darwin" GOPATH="/Users/staff/projects/Minigame_Server"(这正是我的工作目录) GOROOT="/usr/local/go" GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64" CGO_ENABLED="1" - Shane Hou
@ThomasKappler 我认为“project”不必要,因为它在官方文件中没有显示。 - Shane Hou
@ReckHou:在我看来,Thomas的建议是正确的。顺便说一句,如果你刚开始使用Go语言,我建议你使用GOPATH=$HOME,并将foo包的包文件放在~/src/foo/*.go中,然后将其导入路径设置为foo。这对我来说很有效。 - zzzz
显示剩余4条评论
4个回答

11

go命令,测试包。

...名称匹配文件模式“*_test.go”的文件...可以包含测试函数、基准测试函数和示例函数。

不要使用保留名称。例如,将client_test替换为clienttest


1
经过一些测试,这是正确的解决方案,谢谢!PS:包名可以包含“_test”,但文件名不应该。 - Shane Hou

1

好的,最后我找到了我的环境出了什么问题:

由于我使用的是 OS X 系统,所以我使用了 .pkg 文件来安装 Go,而 GOROOT 是“/usr/local/go”

然后我读了另一个虚假的关于 GO 安装的教程,它说我必须在我的 ~/.profile 中定义 GOROOT,于是我在 ~/.profile 中添加了“GOROOT="/usr/local/go"”,然后一切都出错了。

经过仔细阅读官方文档,我发现了这个:

Go 二进制分布版假定它们将被安装在 /usr/local/go(或 Windows 下的 C:\Go)中,但也可以在不同的位置安装它们。如果你这样做了,在使用 Go 工具时,你需要将 GOROOT 环境变量设置为该目录。

例如,如果你将 Go 安装到你的主目录中,你应该将以下命令添加到 $HOME/.profile 中:

export GOROOT=$HOME/go export PATH=$PATH:$GOROOT/bin

但问题是它没有提到如果你在 .pkg 安装后在 ~/.profile 中添加 GOROOT 会发生什么,并且它也没有说你不能这样做。

这是我的 ~/.profile 现在的样子(已纠正):

将GOPATH导出为$HOME/projects/ 将路径添加到$GOPATH/bin

顺便说一句:您不需要在工作区下创建/project文件夹。根据http://golang.org/doc/code.html#tmp_2,它也没有说您必须这样做:

现在,工作区目录树看起来像这样:

bin/
    hello              # command executable
pkg/
    linux_amd64/ 
        example/
            newmath.a  # package object
src/
    example/
        hello/
            hello.go   # command source
        newmath/
            sqrt.go    # package source

2
你是否混淆了 GOROOT 和 GOPATH? - Alexander

0
如果你的 $GOPATH 是 "/Users/staff/projects/Minigame_Server",那么你的 "project" 绝对路径应该是 "/Users/staff/projects/Minigame_Server/src/project"。
你的导入应该是 import "project/src/client_test"
或者,根据你想要做的事情,假设你在 "project" 下有与 Go 相关的子目录 "/pkg" 和 "/bin",将你的 GOPATH 设置为 "/Users/staff/projects/Minigame_Server/project",
然后你可以 import "client_test"。基本思路是,Go 将把导入字符串附加到 $GOPATH/src/ 后面。
文档(有些含糊不清,我同意)在这里:http://golang.org/doc/code.html#tmp_2。我猜你已经阅读过它了,这就是为什么你创建了 /pkg、/bin 和 /src 子目录的原因,但问题在于 GOPATH 应该在哪里,然后是 Go 在查找导入时自动添加的隐式子级(/src 自动添加),最后是导入字符串本身。

-1

您可以使用以下代码在主程序中导入包,它将正常工作: import( "fmt" "./client_test") 在主包中


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接