【golang 配置】gogoprotobuf搭建

2023-05-16

在go中使用 Google  protobuf,有两个可选用的包goprotobuf(go官方出品)和gogoprotobuf。
 gogoprotobuf是完全兼容google protobuf,它生成大代码质量确实要比goprotobuf高一些。
一 安装protobuf:
  1 下载protobuf源码: https://github.com/google/protobuf
      2 进入源码目录:  ./autogen.sh    
           可能遇到问题:1 该脚本会下载gmock,  若被墙,则需FQ下载并解压为gmock放在该源码目录下
                          脚本会执行autoreconf命令,ubantu安装:sudo apt-get install autoconf automake libtool )  
      3 ./configure;make;make check; sudo make install
      4 sudo ldconfig  # refresh shared library cache
错误及解决方法
protoc: error while loading shared libraries: libprotoc.so.8: cannot open shared
错误原因:
protobuf的默认安装路径是/usr/local/lib,而/usr/local/lib 不在Ubuntu体系默认的 LD_LIBRARY_PATH 里,所以就找不到该lib
解决方法:
输入命令 sudo ldconfig 

 
二 安装gogoprotobuf:
     1  go get github.com/gogo/protobuf/proto
     2  go get github.com/gogo/protobuf/protoc-gen-gogo
     3  go get github.com/gogo/protobuf/gogoproto
     4  go get github.com/gogo/protobuf/protoc-gen-gofast
 
三 使用gogoprotobuf:
     1  protoc --gofast_out=. myproto.proto
gogoprotobuf的各个option
1 gogoproto.goproto_enum_prefix 
  选项为false,生成的代码中不加"E_"。
2 gogoproto.goproto_getters
选项为false,不会为message的每个field生成一个Get函数。
3 gogoproto.face
 选项为true的时候,为message生成相应的 interface
4 gogoproto.nullable
nullable这个option违背protobuf的初衷。使用它,message序列化后,gogo为message的每个field设置一个值,而google protobuf则是要求如果一个option的field没有被赋值,则序列化的时候不会把这个成员序列化进最终结果的。
5 gogoproto.customname
field的名称与message的method的名称一样。
还有gogoproto.customtype
6 gogoproto.marshaler gogoproto.sizer  
gogoproto.marshaler_all gogoproto.sizer_all
sizer选项true,gogo会相应的message生成"func Size() int";marshaler为true,gogo为相应的生成:func Marshal()([] byte, int),这个 method会调用Size(),所以marshaler为true的时候,sizer也必须为true。
option (gogoproto.marshaler_all) = true; option (gogoproto.sizer_all) = true;
7 gogoprotobuf.unmarshaler & gogoprotobuf.unmarshaler_all
unmarshaler为true,gogo为相应的message生成func Unmarshal(data []byte) error,代替goprotobuf的proto.Unmarshal([]byte, *struct)函数
option (gogoproto.unmarshaler_all) = true;
例子:
syntax = "proto3";package test;option (gogoproto.gostring_all) = true;option (gogoproto.equal_all) = true;option (gogoproto.verbose_equal_all) = true;// option (gogoproto.goproto_stringer_all) = false;// option (gogoproto.stringer_all) =  true;// option (gogoproto.populate_all) = true;// option (gogoproto.testgen_all) = true;// option (gogoproto.benchgen_all) = true;option (gogoproto.marshaler_all) = true;option (gogoproto.sizer_all) = true;option (gogoproto.unmarshaler_all) = true;option (gogoproto.goproto_getters_all) = false;
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
编译
#!/bin/sh# proto.sh
编译此 .proto 文件:
protoc  --go_out=. *.proto
每个 Protobuf 消息在 Golang 中有哪一些可用的接口

  • 消息中非 repeated 的域都被实现为一个指针,指针为 nil 时表示域未设置
  • 消息中 repeated 的域被实现为 slice
  • 访问枚举值时,使用“枚举类型名_枚举名”的格式(更多内容可以直接阅读生成的源码)
  • 使用 proto.Marshal 函数进行编码,使用 proto.Unmarshal 函数进行解码


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【golang 配置】gogoprotobuf搭建 的相关文章

  • golang-bufio 缓冲扫描

    前面两篇博客 介绍了 bufio 包中的缓冲读和写 bufio go 下面再来介绍一下缓冲扫描 scan go 这个扫描的是用来对缓存读的更高级封装 提供了一些更易用的方法 缓冲扫描 Scanner 提供了一个方便的接口来读取数据 例如使用
  • golang之跨语言ipc通信

    1 golang之跨语言ipc通信 文章目录 1 golang之跨语言ipc通信 1 1 unix domain Socket unix域套接字 介绍 1 2 IPC SOCKET通信 1 2 1 函数及地址定义介绍 1 2 2 UNIX
  • Golang-使用 goroutine 运行闭包的“坑”

    介绍 在 Go 语言中 函数支持匿名函数 闭包就是一种特殊的匿名函数 它可以用于访问函数体外部的变量 需要注意的是 在 for range 中 使用 goroutine 执行闭包时 经常会掉 坑 因为匿名函数可以访问函数体外部的变量 而 f
  • 权重实现随机抽奖

    一般抽奖是怎么实现的 在实习期间学会了一种通用的写法 在这里记录一下 最近在学Golang语法基础 这里就用Golang来写 package main import fmt time math rand func main r rand N
  • Qt webengine 显示web页面、前后端通信以及下载详解

    概述 官方文档 https doc qt io archives qt 5 11 qtwebengine overview html 翻译文档 Qt5 9 WebEngine 概述 一花一世界 一叶一乾坤 博客园 从Qt5 5开始 Qt W
  • golang:环境变量GOPROXY和GO111MODULE设置

    我们安装完golang后 我们在windows的cmd命令下就可以直接查看和使用go命令和环境变量了 同样的在linux下可以在控制台使用 如下图所示 C Users lijie1 gt go env set GO111MODULE set
  • 【golang】error parsing regexp: invalid or unsupported Perl syntax (正则表达式校验密码)

    要在 Go 中编写密码校验规则 确保密码不少于8位且包含数字和字母 你可以使用正则表达式和 Go 的 regexp 包来实现 以下是一个示例代码 错误示范 package main import fmt regexp func valida
  • go 进阶 gin实战相关: 五. gin_scaffold 企业脚手架

    目录 一 gin scaffold 企业级脚手架 二 gin scaffold 脚手架安装及使用演示 文件分层解释 开始使用 1 配置开启go mod 功能 2 下载 安装 gin scaffold 3 整合 golang common 4
  • goland环境配置

    goland modules环境配置 下载和安装goland 环境配置 配置环境变量GOPATH 配置go modules GOPROXY代理的系统变量 工程目录中新建三个工作目录 goland中启用go modules 新建一个go程序
  • 基于Go语言实现简易Web应用

    目录 前言 Go语言特点 写在使用Go语言实现Web应用前面 创建Web服务器 声明一个结构体操作 加入中间件的使用 使用静态文件服务器 最后 前言 在编程语言中 近几年问世的几个新语言都是非常不错的 比如Go Python Rust等等
  • 48.Go简要实现令牌桶限流与熔断器并集成到Gin框架中

    文章目录 一 简介 二 限流器与熔断器在微服务中的作用 1 限流器 对某个接口单位时间内的访问量做限制 2 熔断器 当服务连续报错 超过一定阈值时 打开熔断器使得服务不可用 三 具体实现 1 限流器实现逻辑 以令牌桶算法为例 2 限流器集成
  • go-zero开发入门-API网关鉴权开发示例

    本文是 go zero开发入门 API网关开发示例 一文的延伸 继续之前请先阅读此文 在项目根目录下创建子目录 middleware 在此目录下创建文件 auth go 内容如下 鉴权中间件 package middleware impor
  • GoLong的学习之路,进阶,微服务之序列化协议,Protocol Buffers V3

    这章是接上一章 使用 RPC包 序列化中没有详细去讲 因为这一块需要看的和学习的地方很多 并且这一块是RPC中可以说是最重要的一块 也是性能的重要影响因子 今天这篇主要会讲其使用方式 文章目录 Protocol Buffers V3 背景以
  • 协程-单线程内的异步执行

    1 仿协程实例 不同事件依次顺序执行 coding utf 8 import time def calculate 1 step event name for index in range step print This is s even
  • 【go语言】error错误机制及自定义错误返回类型

    简介 Go 语言通过内置的 error 接口来处理错误 该接口定义如下 type error interface Error string 这意味着任何实现了 Error 方法的类型都可以作为错误类型 在 Go 中 通常使用 errors
  • 【go语言】error错误机制及自定义错误返回类型

    简介 Go 语言通过内置的 error 接口来处理错误 该接口定义如下 type error interface Error string 这意味着任何实现了 Error 方法的类型都可以作为错误类型 在 Go 中 通常使用 errors
  • [每周一更]-(第55期):Go的interface

    参考地址 https juejin cn post 6978322067775029261 https gobyexample com interfaces https go dev tour methods 9 介绍下Go的interfa
  • [每周一更]-(第55期):Go的interface

    参考地址 https juejin cn post 6978322067775029261 https gobyexample com interfaces https go dev tour methods 9 介绍下Go的interfa
  • 这套Go语言开发框架组合真的非常高效

    我尝试过很多框架 从Django Flask和Laravel到NextJS和SvelteKit 到目前为止 这是我唯一可以使用的不会让我感到疯狂或者放弃项目的堆栈 框架 我喜欢所有这些框架 但我只是不太适应它们的设计方式 实际上 我是一个弱
  • 【go语言】结构体数据填充生成md错误码文件

    这里使用pongo2这个模版引擎库进行md文件渲染 GitHub flosch pongo2 Django syntax like template engine for Go package main import fmt github

随机推荐