go - Go 中的 Protocol Buffer : cannot find package

标签 go protocol-buffers

我正在关注 Protocol Buffer for Go tutorial但我有以下问题:

  1. 我创建地址簿原型(prototype)定义
syntax = "proto3";
package tutorial;

message Person {
  string name = 1;
...
}
  • 我成功运行编译器并生成 go 代码
  • 我尝试导入 pb 包但失败
  • 这正是发生的情况:我指定 --go_out 与我的原型(prototype)定义相同:(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
    

    我做错了什么?为了使这项工作有效,导入应该是什么样子?

    谢谢!

    仅供引用:我的 go 环境的片段:

    GOARCH="amd64"
    GOBIN="/home/vagrant/go2/bin"
    GOEXE=""
    GOHOSTARCH="amd64"
    GOHOSTOS="linux"
    GOOS="linux"
    GOPATH="/home/vagrant/go2"
    GORACE=""
    GOROOT="/usr/local/go"
    

    最佳答案

    这个问题说明了我对Go的封装缺乏了解。经过一番阅读后,这是我的结论/规则:
    1、一文件夹一个包:“abc”目录下的所有.go文件都会显示package abc
    2. 无法获得包裹main和包装abc在同一文件夹中
    3.go install创建包对象 abc.a$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 mainimport "protobufs/tutorial"

    感谢您走上正确的道路!

    关于go - Go 中的 Protocol Buffer : cannot find package,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43815108/

    相关文章:

    mongodb - bson.M {} deepequal 似乎无法处理 int32

    c# - Protobuf 解码任意消息。 Protobuf 消息多态性

    protocol-buffers - 我可以停用必需的 protobuf 字段吗?

    c++ - 您是否必须在您的项目中提供 proto 文件?

    c++ - 交叉编译Qt to Raspberry Pi 3B+ addressbook (Protocol Buffer) - error symbol lookup error

    java - gRPC 不为服务生成接口(interface),只生成服务类

    Golang Web Crawler解决方案,2个数据竞争,退出状态66

    sockets - 没有可用的缓冲区空间(tcp.cpp :69) when setting SNDBUF and RCVBUF ZeroMQ, golang,MacOSX

    google-app-engine - 在 App Engine 中使用 rpc/jsonrpc

    list - Golang - 链接到 id 的套接字片段以进行通知