【问题标题】:Strange golang package import issue奇怪的golang包导入问题
【发布时间】:2013-03-02 14:34:30
【问题描述】:

这是目录树:

+/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?,我想我有和这个人一样的解决方案,但我只是不知道如何解决这个问题。请帮忙。

进入环境:

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 的输出?
  • import 依次尝试从它从您的$GOPATH 中提取的每个“工作区”开始查找指定路径。从你的树来看,我会说你的$GOPATH 必须包含/some/path/to/project,也就是说,它必须包含那个“项目”目录。这适用于您的情况吗?
  • 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"
  • GOPATH 应该是“/Users/staff/projects/Minigame_Server/project”。
  • @ThomasKappler 我认为不需要“项目”,因为它没有显示在官方文档中。

标签: go


【解决方案1】:

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

你的导入应该是import "project/src/client_test"

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

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

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

【讨论】:

    【解决方案2】:

    Command go, Test packages.

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

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

    【讨论】:

    • 经过一些测试,这是正确的解决方案,谢谢! PS:包名可以包含“_test”,但文件名不能。
    【解决方案3】:

    好吧,我终于发现我的环境出了什么问题:

    由于我使用的是 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:

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

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

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

    导出 GOPATH=$HOME/projects/ 导出 PATH=$PATH:$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
    

    【讨论】:

    • 你是在混淆 GOROOT 和 GOPATH 吗?
    【解决方案4】:

    您可以使用以下代码在 main 中导入包,它将起作用 进口( “fmt” "./client_test") 在主包中

    【讨论】:

      猜你喜欢
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多