协议缓冲区:找不到包
我正在关注的Protocol Buffer for Go tutorial但我有以下问题:协议缓冲区:找不到包
- 我创建的地址簿协议定义
syntax = "proto3"; package tutorial; message Person { string name = 1; ... }
- 我成功运行编译器并生成代码
- 我尝试导入pb包但失败
这里是什么情况:我指定--go_out
是同我的原定义:(protoc --go_out=. addressbook.proto
)
然后在同一个文件夹中,我创建这些简单的线条test.go:
package main
import "tutorial"
但go build test.go
返回错误:
test.go:3:8: cannot find package "tutorial" in any of:
/usr/local/go/src/tutorial (from $GOROOT)
/home/vagrant/go2/src/tutorial (from $GOPATH)
然后我改变test.go
这样:
package main
import "protobufs/tutorial"
,并得到这个错误:
test.go:3:8: cannot find package "protobufs/tutorial" in any of:
/usr/local/go/src/protobufs/tutorial (from $GOROOT)
/home/vagrant/go2/src/protobufs/tutorial (from $GOPATH)
,但如果我改变了进口只:
package main
import "protobufs"
发现,有一个 “教程” 包在该位置:
test.go:3:8: found packages tutorial (addressbook.pb.go) and main (list_people.go) in /home/vagrant/go2/src/protobufs
我在做什么错?进口应该如何才能完成这项工作?
谢谢!
FYI:我去ENV的一个片段:
GOARCH="amd64"
GOBIN="/home/vagrant/go2/bin"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/vagrant/go2"
GORACE=""
GOROOT="/usr/local/go"
这个问题表明我缺乏围棋包装的理解。一些阅读后,这里是我的结论/规则:
每个文件夹 1.一个包:所有在目录“ABC”的。去的文件将显示package abc
2.你不能有包main
和包装abc
在相同的文件夹
3. go install
创建包对象abc.a
in $GOPATH/pkg/GOOS_GOARCH/<path_to_abc_excluding_abc>
4。在文件夹中的包main
$GOPATH/src/x/y/z/foo/
然后go install
编译并安装名为foo
在$GOPATH/bin
一个可执行文件(路径的最后一个目录名)现在,回到最初的问题:目录$GOPATH/src/protobufs
包含多个包:
- 编译的protobuf包名tutorial
和
- main
包test.go
这与上述规则相矛盾。
我相信,一个优雅的解决方案是:
- 假设我在$GOPATH/src/protobufs
- 创建一个名为子目录tutorials
- 安装编译的protobuf在子目录:protoc --go_out=./tutorial ./addressbook.proto
- 在test.go
现在可以有package main
和import "protobufs/tutorial"
感谢您投入正确的赛道!
为了让编译好的protobuf可以导入为“tutorial”,需要将'--go_out ='设置为'$ GOPATH/src/tutorial'。 –
是的,这是有效的。谢谢 ! ...似乎我需要阅读更多关于golang的导入,因为我不明白为什么我不能从同一目录导入它 – whyme