Windows下使用proto问题记录

系列文章目录

最近项目中计划使用protoc框架,在这里预研的过程中遇到一些问题,在此做下记录。


一、Protocol Buffers是什么?

        协议缓冲区(又名 protobuf)是 Google 的语言中立、平台中立、可扩展的结构化数据序列化机制。您可以在 Google Developers 站点上找到protobuf 的文档

此 README 文件包含 protobuf 安装说明。要安装 protobuf,您需要为您选择的编程语言安装协议编译器(用于编译 .proto 文件)和 protobuf 运行时。

git地址:https://github.com/protocolbuffers/protobuf

下载地址:https://github.com/protocolbuffers/protobuf/tags

二、安装

1、安装看以下地址

我安装的是win64版本的protoc。

https://www.jianshu.com/p/102485516187

2、命令使用

## 将当前所在目录切换到proto文件所在目录下
## 若只是想生成序列化和反序列话的文件,那么仅使用以下命令
protoc -I. --go_out=. *.proto

## 若想生成服务器和客户端通讯、实现的公共库代码,那么还需要继续使用以下命令
protoc -I. --go-grpc_out=. *.proto

三、问题

1、'protoc-gen-go' 不是内部或外部命令,也不是可运行的程序或批处理文件。

原因:缺少包,那就安装包,这里提供两种方式,默认使用第一种。
        (1)protocol buffer 编译器需要一个插件来生成 Go 代码。通过运行以下命令使用 Go 1.16 或更高版本安装它,它会在你的$gopath的bin目录下生成 protoc-gen-go.exe 文件:

go install google.golang.org/protobuf/cmd/protoc-gen-go@latest

        (2)解决方法:

go get -u github.com/golang/protobuf/protoc-gen-go

         因为我是使用mod模式,所以我的下载后的文件在%GOPATH%/pkg/mod下边,进入到protobuf/protoc-gen-go/ 下,执行以下命令后解决问题。

go build
go install

2、生成*.pb.go文件报错

        (1)想在go项目中生成相关*.pb.go文件,结果失败。

        错误截图如下:

 

        原因:因为helloworld.proto中的go_package配置路径文件,在这里我使用了windows下的路径方式,因此执行失败,只能存在.或/符号。

        (2)修改\\为/后,继续执行还是报错,如下:

 

        原因:找不到E:的这个路径,当将 E: 该为其它路径 D: 时同样报错。

        解决方法:直接将 E: 给去掉后,执行成功,在这个路径中不能存在E:这种盘符路径。

 

        注释:该go_package配置为生成 .pb.go文件的路径,以当前helloworld.proto文件所在目录为根目录,在此目录下自动创建文件夹和文件。

3、结合grpc插件使用失败

         解决:替换为如下图所示命令成功生成文件。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Go 中使用 Protocol Buffers(简称 proto)可以通过以下步骤进行: 1. 安装 protoc 编译器:Protocol Buffers 使用 protoc 编译器将 .proto 文件编译成 Go 代码。你可以从 [Protocol Buffers GitHub 仓库](https://github.com/protocolbuffers/protobuf/releases) 下载适合你操作系统的 protoc 编译器,并将其添加到系统 PATH 环境变量中。 2. 编写 .proto 文件:创建一个名为 example.proto 的文本文件,并使用 Protocol Buffers 的语法定义消息结构和服务。 示例 example.proto 文件: ```protobuf syntax = "proto3"; package example; message Person { string name = 1; int32 age = 2; repeated string hobbies = 3; } service Greeting { rpc SayHello (Person) returns (Person); } ``` 3. 生成 Go 代码:使用 protoc 编译器将 .proto 文件生成 Go 代码。在终端中运行以下命令: ```shell protoc --go_out=. example.proto ``` 这将在当前目录下生成一个 example.pb.go 文件,其中包含了根据 .proto 文件生成的 Go 结构体和服务代码。 4. 在 Go 代码中使用生成的代码:在你的 Go 代码中导入生成的代码文件,并使用其中定义的结构体和服务进行编程。 示例 Go 代码: ```go package main import ( "fmt" "log" example "path/to/generated/code" // 导入生成的代码包 "google.golang.org/protobuf/proto" ) func main() { person := &example.Person{ Name: "John", Age: 25, Hobbies: []string{"reading", "coding"}, } data, err := proto.Marshal(person) if err != nil { log.Fatal(err) } // 在这里可以将 data 发送给其他地方进行传输或存储 newPerson := &example.Person{} err = proto.Unmarshal(data, newPerson) if err != nil { log.Fatal(err) } fmt.Println(newPerson.GetName()) // 输出:John } ``` 以上就是使用 Protocol Buffers 在 Go 中的基本步骤。你可以根据自己的需求定义更复杂的消息结构和服务,并使用生成的 Go 代码进行序列化、反序列化等操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值