当前位置: 首页 > 面试题库 >

golang:核心net / http包导入错误

富凯旋
2023-03-14
问题内容

我已经将go源代码使用克隆git clone https://go.googlesource.com/go到了我的~/godev/目录(文档建议在GOPATH之外)。

我的$ GOPATH是 ~/gocode

我使用官方的osx安装程序安装了go 1.8.1。

如果我进入~/godev/go/src/net/http并运行go test,则会出现以下错误:

h2_bundle.go:46:2: cannot find package "golang_org/x/net/http2/hpack" in any of:
    /usr/local/go/src/golang_org/x/net/http2/hpack (from $GOROOT)
    ~/gocode/src/golang_org/x/net/http2/hpack (from $GOPATH)
h2_bundle.go:47:2: cannot find package "golang_org/x/net/idna" in any of:
    /usr/local/go/src/golang_org/x/net/idna (from $GOROOT)
    ~/gocode/src/golang_org/x/net/idna (from $GOPATH)
h2_bundle.go:48:2: cannot find package "golang_org/x/net/lex/httplex" in any of:
    /usr/local/go/src/golang_org/x/net/lex/httplex (from $GOROOT)
    ~/gocode/src/golang_org/x/net/lex/httplex (from $GOPATH)
transport.go:32:2: cannot find package "golang_org/x/net/proxy" in any of:
    /usr/local/go/src/golang_org/x/net/proxy (from $GOROOT)
    ~/gocode/src/golang_org/x/net/proxy (from $GOPATH)
transfer.go:14:2: use of internal package not allowed

在按照此处的指示进行操作cd $GOPATH/src之后cp -R /usr/local/go/src/vendor/golang_org .,仍然出现以下错误:

h2_bundle.go:47:2: code in directory ~/gocode/src/golang_org/x/net/idna expects import "golang.org/x/net/idna"
transport.go:32:2: cannot find package "golang_org/x/net/proxy" in any of:
    /usr/local/go/src/golang_org/x/net/proxy (from $GOROOT)
    ~/gocode/src/golang_org/x/net/proxy (from $GOPATH)
transfer.go:14:2: use of internal package not allowed

的确,〜/ gocode / src / golang_org / x / net下没有代理程序包,但是我仍然不知道如何解决该问题以及其他2个错误。

GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="~/gocode"
GORACE=""
GOROOT="/usr/local/go"
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GCCGO="gccgo"
CC="clang"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/71/k_tftg2d1qd7gf5ww0n_wl_r0000gn/T/go-build541211050=/tmp/go-build -gno-record-gcc-switches -fno-common"
CXX="clang++"
CGO_ENABLED="1"
PKG_CONFIG="pkg-config"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"

如果我运行all.bash脚本,它将运行所有单元测试,但这很耗时。有没有一种方法可以只运行net / http测试而不会出现这些错误?


问题答案:

这里的问题是您正在运行go testgo命令是您的1.8.1安装。为了使测试正常工作,您应该使用从开发目录构建的Go工具链运行。

  1. 确保您已经构建了Go工具链cd ~/godev/src; ./make.bash./all.bash也可以使用,但是您将不得不等待测试运行,而不仅仅是构建工具链)。
  2. 使用新编译的工具链运行测试cd ~/godev/src/net/http; ~/godev/bin/go test

建议您在个人资料中添加一个别名,例如alias godev=~/godev/bin/go,然后即可运行godev test

还要确保您未设置GOROOT环境变量,因为这将导致go命令使用指定的路径作为GOROOT,而不管您使用的是哪个工具链(不是您想要的工具链)。

更新资料

根据评论中的要求,以下是我可以提供的简短说明:

  1. 提到“找不到包”的错误是在寻找供应商提供的某些包~/godev/src/vendor/golang_net/...。但是,仅在软件包位于GOPATH或GOROOT内时,才在1.5 / 1.6中添加供应商支持。您的godev安装不在(也不应该在)GOPATH中,并且GOROOT指向1.8.1安装。

  2. transfer.go:14:2: use of internal package not allowed是因为transfer.go进口net/http/internal。由于这不是相对路径,因此可以在中找到$GOROOT/src/net/http/internal,而~/godev/src/net/http/internal如果导入包与内部目录不共享公共根目录,则不能导入内部包。

归结为指向1.8.1安装的GOROOT。您可能想知道是否可以仅将GOROOT设置为指向您的godev目录,但这也无法正常工作。我不太确定这里的机制,但是我认为问题归结为1.8.1编译器期望的是in中的不匹配~/godev/src/runtime

编译工具链时,将编译GOROOT的位置,因此在~/godev/bin/go运行时,它将~/godev用作GOROOT。



 类似资料:
  • .NET核心和ASP.NET核心到底有什么区别?

  • 我读过关于.NET标准和.NET核心之间的区别,但我真的不知道区别是什么,也不知道什么时候选择.NET标准库项目,什么时候选择.NET核心库项目。

  • alias syntax: alias file-path|directory-path; default: no context: location This directive assigns a path to be used for the indicated location. Note that it may look similar to the root directive, bu

  • 遵循以下文档:https://docs.microsoft.com/fr-fr/aspnet/core/grpc/authn-and-authz?view=aspnetcore-3.0#承载令牌身份验证,我尝试配置我的GRPC客户端以自动注入JWT令牌。 但它被Grpc.Core中的一个例外“提供的通道凭据不允许组合”窒息 这是什么意思?我应该如何提供HTTP授权标头?

  • 我有一个用。NET内核编写的API,并使用xUnit来测试它们。 我的测试用例如下: 我如何在这里检查从我的控制器方法调用返回的状态代码500。类似于 在调试时,我可以看到响应具有结果返回类型(Microsoft.aspnetcore.mvc.ObjectResult),该类型的为500。

  • 我想知道,当我们为客户提供新的更新时,是否有丢失这些文件的风险。如果有更好的解决方案,上传文件和获取文件链接之后,与.NET core请告诉我:)