Golang 集成 Protobuf 及 vscode 配置

栏目: Go · 发布时间: 7年前

内容简介:在存储相对复杂的结构体时 protobuf 比 json 更高效,而且方便后期字段扩展。我们可以将数据用 protobuf 序列化后存入 mysql 或 redis 中注意: 如果不指定版本,会使用 master 分支,而 dep 等包管理工具,会优先拉取 release 的版本,导致编译出的 protoc-gen-go 与 vendor 里的源码版本不一致,最终编译报错

在存储相对复杂的结构体时 protobuf 比 json 更高效,而且方便后期字段扩展。

我们可以将数据用 protobuf 序列化后存入 mysqlredis

一、安装 Protobuf

  1. 拉取项目
$ go get -d -u github.com/golang/protobuf/protoc-gen-go
  1. 切换到 release 版本
$ git -C "$(go env GOPATH)"/src/github.com/golang/protobuf checkout v1.2.0

注意: 如果不指定版本,会使用 master 分支,而 dep 等包管理工具,会优先拉取 release 的版本,导致编译出的 protoc-gen-go 与 vendor 里的源码版本不一致,最终编译报错

替代方案:如果此处不指定版本,可以在 dep 的配置文件 gopkg.toml 里指定为 master

[[override]]
  branch = "master"
  name = "github.com/golang/protobuf"
  1. 编译安装
$ go install github.com/golang/protobuf/protoc-gen-go

二、项目中创建 proto 文件

  1. 定义 proto 对象
$ vim protos/protos.pb.go
syntax = "proto3";

package protos;

message Info {
  uint32 UID = 1;
  int32 Power = 3;
  int64 StartedAt = 4;
  double OutputMoney = 7;
}
  1. 编译成 go 文件
$ protoc --go_out=. protos/*.proto
  1. 代码里使用
import (
    "time"
    "demo-api/protos"

    "github.com/golang/protobuf/proto"
)

// 序列化
obj := protos.Info{
  UID: 1,
  Power: 2,
  StartedAt: time.Now().Unix(),
  OutputMoney: 0,
}
data, err := proto.Marshal(obj)
Check(err)

// 反序列化
var info protos.Info
err = proto.Unmarshal(data, &info)
Check(err)

三、VSCode 自动提示和格式化

安装插件 vscode-proto3 及其依赖的 Clang-Format

如果存在报错 clang-format not installed ,需要在系统里安装 clang-format

# MacOS可以直接通过brew安装
$ brew install clang-format

四、总结

  1. 时间类型

    golang 里的 time.Time,protobuf 也可以支持,但是我不希望在代码里做额外的类型转换,所有 proto 里的时间都定义成了 int64,用来存储 unix timestamp

  2. Uid 和 UID 的问题

    这是 golang 里比较恶心的问题,proto 里如果变量名为 uid,编译后会转换为 Uid,而自家的 golang 规范却要求的是 UID,所以我们再 proto 里可以直接命名为 UID

  3. int 和 int32

    protobuf 不支持 int,所以在 golang 里与 proto 对应的字段都由 int 改成了 int32, 减少强制转换次数


以上所述就是小编给大家介绍的《Golang 集成 Protobuf 及 vscode 配置》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Code Reading

Code Reading

Diomidis Spinellis / Addison-Wesley Professional / 2003-06-06 / USD 64.99

This book is a unique and essential reference that focuses upon the reading and comprehension of existing software code. While code reading is an important task faced by the vast majority of students,......一起来看看 《Code Reading》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具