奇怪的golang包导入问题

时间:2013-03-14 09:54:46

标签: go

这是目录树:

+/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

我已经阅读了How to use custom packages in golang?,我认为我有这样的解决方案,但我只是不知道如何解决这个问题。请帮忙。

go env:

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"  

4 个答案:

答案 0 :(得分:11)

  

Command go, Test packages.

     

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

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

答案 1 :(得分:1)

好的,我终于找到了我的环境出了什么问题:

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

然后我读了另一个关于GO installtion的假教程,它说我必须在我的〜/ .profile中定义GOROOT,所以我在〜/ .profile里面添加了“GOROOT =”/ usr / local / go“,然后一切都去了错。

仔细阅读官方文件后我发现了这个:

  

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

     

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

     

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

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

这是我的〜/ .profile看起来像现在(正在纠正):

导出GOPATH = $ HOME / projects / export PATH = $ PATH:$ GOPATH / bin

BTW:您不需要在工作区下创建/项目文件夹。根据{{​​3}},它也没有说你必须:

  

工作区目录树现在如下所示:

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 :(得分:0)

如果你的$ GOPATH是“/ Users / staff / projects / Minigame_Server”,你的“项目”绝对路径应该是“/ Users / staff / projects / Minigame_Server / src / project”。

您的导入应为import "project/src/client_test"

或者,您似乎想要做什么,假设您在“项目”下有与Go相关的子目录“/ pkg”和“/ bin”,请将您的GOPATH设置为“/ Users / staff / projects / Minigame_Server /项目“

然后你可以import "client_test"。基本思路是Go会将导入字符串附加到$ GOPATH / src /.

(有点模棱两可,我同意)doc在这里:http://golang.org/doc/code.html#tmp_2。我的猜测是你已经阅读了它,这就是为什么你创建了/ pkg,/ bin和/ src子目录,但是catch应该是GOPATH的位置,然后是Go在查找导入时自动添加的隐式子级别(/ src自动添加),然后按原样导入字符串。

答案 3 :(得分:-1)

您可以使用以下可以使用的代码在main中导入包 进口( “FMT” “./client_test”) 在主包中