Golang中Protobuf已知类型的解析与应用
Golang中Protobuf已知类型的解析与应用
最近我在我们的protobuf代码中引入了google.protobuf.Empty消息的使用,并在一个Docker容器(golang:1.14)中进行构建。然而,在尝试编译proto文件时,我遇到了以下错误:
google/protobuf/empty.proto: 文件未找到。 validation.proto: 导入“google/protobuf/empty.proto”未找到或存在错误。
对于如何获取已知的protobuf proto文件,有什么建议吗?
好的,我只需要在apt-get指令中添加Debian软件包libprotobuf-dev。
更多关于Golang中Protobuf已知类型的解析与应用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Golang中解析Protobuf已知类型时,需要确保正确导入google/protobuf的proto文件。以下是解决方案和示例代码:
首先,安装必要的依赖包:
go get -u google.golang.org/protobuf
go get -u google.golang.org/grpc
对于proto文件,需要正确设置导入路径。以下是示例proto文件内容:
syntax = "proto3";
package example;
import "google/protobuf/empty.proto";
service ExampleService {
rpc DoSomething (google.protobuf.Empty) returns (google.protobuf.Empty);
}
在编译proto文件时,需要使用-I参数指定导入路径。以下是编译命令示例:
protoc -I . \
-I /usr/local/include \
-I ${GOPATH}/src \
-I ${GOPATH}/pkg/mod/github.com/golang/protobuf@v1.4.2 \
--go_out=. \
--go-grpc_out=. \
validation.proto
如果使用buf工具,可以创建以下buf.yaml配置文件:
version: v1
deps:
- buf.build/googleapis/googleapis
在Go代码中使用google.protobuf.Empty的示例:
package main
import (
"context"
"log"
"google.golang.org/grpc"
"google.golang.org/protobuf/types/known/emptypb"
pb "path/to/your/proto/package"
)
func callEmptyEndpoint(conn *grpc.ClientConn) {
client := pb.NewExampleServiceClient(conn)
// 创建Empty消息
emptyReq := &emptypb.Empty{}
// 调用gRPC方法
resp, err := client.DoSomething(context.Background(), emptyReq)
if err != nil {
log.Fatalf("调用失败: %v", err)
}
_ = resp // 处理响应
}
对于Docker构建,确保Dockerfile中包含正确的protoc安装和依赖下载:
FROM golang:1.14
# 安装protoc
RUN apt-get update && apt-get install -y protobuf-compiler
# 复制go.mod和go.sum文件
COPY go.mod go.sum ./
RUN go mod download
# 复制并编译proto文件
COPY . .
RUN protoc --go_out=. --go_opt=paths=source_relative \
--go-grpc_out=. --go-grpc_opt=paths=source_relative \
-I=/usr/local/include \
-I=. \
validation.proto
# 构建应用
RUN go build -o app .
如果使用go modules,确保go.mod中包含正确的依赖:
module your-module
go 1.14
require (
google.golang.org/grpc v1.40.0
google.golang.org/protobuf v1.27.1
)

