找回密码
 立即注册
查看: 195|回复: 1

Go使用Protobuf

[复制链接]
发表于 2022-7-9 20:31 | 显示全部楼层 |阅读模式

  • 安装protoc命令
进入protobuf仓库,下载和电脑相对应的版本
https://github.com/protocolbuffers/protobuf/releases

解压后可以在bin目录看到对应的二进制执行文件


将该文件添加到环境目录下。
在mac上也使用命令安装:
brew install protobuf

  • 安装gogoprotobuf插件
三个插件选择其中一个
// go官方
go get github.com/golang/protobuf/protoc-gen-go

// 完全兼容google protobuf,它生成的代码质量和编解码性能均比goprotobuf高一些
go get github.com/gogo/protobuf/protoc-gen-gogo

// 最快
go get github.com/gogo/protobuf/protoc-gen-gofast

  • 安装gogoprotobuf库文件
go get github.com/gogo/protobuf/proto

  • 生成文件
和下载的插件选择的对应命令
// go
protoc --go_out=. *.proto

// gogo
protoc --gogo_out=. *.proto

// gofast
protoc --gofast_out=. *.proto

  • 使用
消息定义
syntax = "proto3";
package proto;

message User {
    int32 userId = 1;
    string username = 2;
}使用消息
package main

import (
        "fmt"
        "go-demo/protocol"

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

func main() {
        user := protocol.User{
                UserId: 1,
                Username: "testname",
        }
        // 将protocol消息序列化成二进制
        userByte, err := proto.Marshal(&user)
        if nil != err {
                fmt.Println(err.Error())
                return;
        }

        fmt.Println(userByte)

        // 将二进制消息反序列化
        userNew := protocol.User{}
        err2 := proto.Unmarshal(userByte, &userNew)
        if nil != err2 {
                fmt.Println(err2.Error())
        }

        fmt.Printf("%+v\n", userNew)
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2022-7-9 20:36 | 显示全部楼层
太有意思了
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-25 20:15 , Processed in 0.091330 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表