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文件,有什么建议吗?

2 回复

好的,我只需要在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
)
回到顶部