2017-05-05 131 views
0

我正在关注的Protocol Buffer for Go tutorial但我有以下问题:协议缓冲区:找不到包

  1. 我创建的地址簿协议定义
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

    为了让编译好的protobuf可以导入为“tutorial”,需要将'--go_out ='设置为'$ GOPATH/src/tutorial'。 –

    +0

    是的,这是有效的。谢谢 ! ...似乎我需要阅读更多关于golang的导入,因为我不明白为什么我不能从同一目录导入它 – whyme

    回答

    0

    这个问题表明我缺乏围棋包装的理解。一些阅读后,这里是我的结论/规则:
    每个文件夹 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
    - maintest.go
    这与上述规则相矛盾。

    我相信,一个优雅的解决方案是:
    - 假设我在$GOPATH/src/protobufs
    - 创建一个名为子目录tutorials
    - 安装编译的protobuf在子目录:protoc --go_out=./tutorial ./addressbook.proto
    - 在test.go现在可以有package mainimport "protobufs/tutorial"

    感谢您投入正确的赛道!