当前位置: 首页 > news >正文

golang proto3 使用 - liyan

依赖环境

这部分主要参照官网教程来:

  • protoc 安装:
    github-protobuf-releases 下载对应平台的 protoc 编译器即可;
  • protoc-gen-go 安装:
    go install google.golang.org/protobuf/cmd/protoc-gen-go@latest 需要能够安装对应语言的插件,proto 文件才被翻译为对应语言可调用的模块;

示例代码

比较推荐将proto文件单独放入一个仓库。proto一般定义的是需要服务/模块间共享的,所以单独放在一个仓库里便于调用及约定的维护。

.
├── main.go
└── proto└── user.proto
// main.go
package mainimport ("bytes""fmt""log""net/http""proto/message""github.com/gin-gonic/gin""github.com/gogo/protobuf/jsonpb"jsoniter "github.com/json-iterator/go""google.golang.org/protobuf/proto"
)func main() {msg := message.UserInfo{UserList: []*message.UserInfo_User{{Username: "test"}}}msg.UserList = append(msg.UserList, &message.UserInfo_User{Username: "test1"})// go message 可以直接序列化为 json bytebyt, err := jsoniter.Marshal(&msg)if err != nil {log.Fatal("cannot parse to json")}fmt.Println("json result: ", string(byt))// 可以将 json 对象反序列化为 go message 对象msg1 := &message.UserInfo{}err = jsonpb.Unmarshal(bytes.NewReader(byt), msg1)if err != nil {log.Fatal("parse failed, ", err)}fmt.Printf("parsed: %+v
", msg1)// protobuf 本身的字符串表征msg1Str := msg1.String()fmt.Println("msg1 string, ", msg1Str)// protobuf 序列化out, err := proto.Marshal(msg1)fmt.Println("msg1 marshal result is, ", string(out))msg2 := message.UserInfo{}// 将序列化后的结果,反序列化为 message 对象proto.Unmarshal(out, &msg2)fmt.Printf("unmarshal result msg2 is: %+v
", &msg2)engine := gin.Default()engine.GET("check", func(c *gin.Context) {// message 对象可以直接用来作为接口的返回值c.JSON(http.StatusOK, &msg1)})srv := &http.Server{}srv.Addr = "0.0.0.0:9988"srv.Handler = enginesrv.ListenAndServe()
}// proto/user.proto
syntax = "proto3";package user_info;// 对于 golang 的使用说,这里的 go_package 是必须的。表述的是编译后的模块名
option go_package = "./message";message UserInfo{message User{string username = 1;uint32 age = 2;string graduate = 3;}repeated User user_list = 1;
}

进行编译:protoc -I./proto user.proto --go_out=./

.
├── go.mod
├── go.sum
├── main.go
├── message
│   └── user.pb.go
└── proto└── user.proto2 directories, 5 files

执行 go run main.go

go run main.go
json result:  {"user_list":[{"username":"test"},{"username":"test1"}]}
parsed: user_list:{username:"test"}  user_list:{username:"test1"}
msg1 string,  user_list:{username:"test"}  user_list:{username:"test1"}
msg1 marshal result is,testtest1
unmarshal result msg2 is: user_list:{username:"test"}  user_list:{username:"test1"}
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.- using env:	export GIN_MODE=release- using code:	gin.SetMode(gin.ReleaseMode)[GIN-debug] GET    /check_must               --> main.main.func1 (3 handlers)

总结

protocol buffer 在大多数场景下,都能兼容json对象的使用场景。其劣势为序列化相关操作时额外的性能开销。对于与外部进行交互、不会进行频繁序列化、反序列化的数据,可以考虑优先使用protocol buffer

http://www.jsqmd.com/news/417100/

相关文章:

  • PaperZZ论文查重系统全解析:从查重到AIGC检测,一站式学术诚信守护方案
  • 【译文/effective-rust】第 27 条:为公共接口撰写文档 - liyan
  • golang GMP - liyan
  • eBPF tail-calls示例 - liyan
  • 视频创作者最易踩的5个版权“深坑”,你中了几个
  • ebpf 采集ebpf 采集tag+tcp五元组 - liyan
  • 正则替换拷贝
  • emacs-若干语言 lsp 配置备注 - liyan
  • Linux sed 命令
  • 【面板数据】更新-省级产业结构高级化及合理化数据-含代码(2000-2024年)
  • AgentRun 实践指南:Agent 的宝藏工具——All-In-One Sandbox
  • Emacs 字符操作快捷键 - liyan
  • 全国艺术留学推荐,看看满足条件后哪个学校和中介通过率更高 - mypinpai
  • win10 安装ffmpeg
  • 浙江杭泰产品质量与种类情况,在多地服务的费用贵吗 - 工业推荐榜
  • Gemini 3.1 Flash Image (Nano Banana 2) API 评测:从参数到落地,我替你踩了坑 - 147API
  • 2026年化工生产用氨水采购指南:脱硫/电子级/食品级氨水专业供应商推荐 - 品牌推荐官
  • 岱宇国际在上海的口碑排名,看看其技术实力、品牌知名度和用户体验 - myqiye
  • 分析2026年宁德性价比高的全屋定制,生产厂合作案例多的排名 - 工业品牌热点
  • Rust枚举OptionT
  • 2026年GEO营销风向标:国内领先的GEO整合营销服务商排名及TOP 3选型指南 - 资讯焦点
  • 2026年最新喷胶厂商实力排行榜:基于环保性能与市场口碑的五大公司权威推荐榜单 - 十大品牌榜
  • 2026年全国聚丙烯纤维厂家权威榜单 靠谱优质实力强 抗裂增强适配多工程场景 - 深度智识库
  • 暑期亲子草原游,呼和浩特哪家旅行社有牧民体验?手把手教你选对呼和浩特亲子草原游,3步识别真动手、真牧户、真安全 - 资讯焦点
  • project管理工具哪个好?2026年project管理工具推荐与排名,解决定制化与安全痛点 - 十大品牌推荐
  • 2026实验室排风厂家五大推荐:迅领实验室领衔,打造安全高效实验环境 - 深度智识库
  • js--28
  • project管理软件哪个好?2026年project管理软件推荐与排名,解决复杂项目与效能度量核心痛点 - 十大品牌推荐
  • 计算机毕业设计springboot高校学生社团管理系统 基于SpringBoot框架的大学生社团活动管理平台设计与实现 高校学生组织数字化运营系统——以社团管理为核心的信息化解决方案
  • 2026清洁度分析仪源头厂家最新排名,西恩士这些企业值得关注 - 工业干货社