文档章节

golang使用protobuf简易教程

科陆李明
 科陆李明
发布于 08/16 23:28
字数 760
阅读 198
收藏 0

参考文档:https://blog.csdn.net/qq_15437667/article/details/78425151

一、安装protobuf

# 去github.com/golang/protobuf下载源码包,
# 拷贝到 $GOPATH/src/github.com/golang/protobuf

$ cd $GOPATH/src/github.com/golang/protobuf
$ go install

# 安装 protobuf-compiler
$ sudo apt-get install protobuf-compiler

二、使用protobuf

1. 编写example.proto示例文件

// example.proto
syntax = "proto2";
package example;

message LD
{
    required uint32 ip = 1;
}

message Set
{
	required uint32 id	=1;
	required string name	=2;
	repeated LD ld_list	=3;
}

2. 编译生成.pb.go文件

protoc --go_out=./ example.proto

生成的 example.pb.go文件

// Code generated by protoc-gen-go. DO NOT EDIT.
// source: example.proto

package example

import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package

type LD struct {
	Ip                   *uint32  `protobuf:"varint,1,req,name=ip" json:"ip,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *LD) Reset()         { *m = LD{} }
func (m *LD) String() string { return proto.CompactTextString(m) }
func (*LD) ProtoMessage()    {}
func (*LD) Descriptor() ([]byte, []int) {
	return fileDescriptor_example_c8b6363476e787b3, []int{0}
}
func (m *LD) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_LD.Unmarshal(m, b)
}
func (m *LD) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_LD.Marshal(b, m, deterministic)
}
func (dst *LD) XXX_Merge(src proto.Message) {
	xxx_messageInfo_LD.Merge(dst, src)
}
func (m *LD) XXX_Size() int {
	return xxx_messageInfo_LD.Size(m)
}
func (m *LD) XXX_DiscardUnknown() {
	xxx_messageInfo_LD.DiscardUnknown(m)
}

var xxx_messageInfo_LD proto.InternalMessageInfo

func (m *LD) GetIp() uint32 {
	if m != nil && m.Ip != nil {
		return *m.Ip
	}
	return 0
}

type Set struct {
	Id                   *uint32  `protobuf:"varint,1,req,name=id" json:"id,omitempty"`
	Name                 *string  `protobuf:"bytes,2,req,name=name" json:"name,omitempty"`
	LdList               []*LD    `protobuf:"bytes,3,rep,name=ld_list" json:"ld_list,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Set) Reset()         { *m = Set{} }
func (m *Set) String() string { return proto.CompactTextString(m) }
func (*Set) ProtoMessage()    {}
func (*Set) Descriptor() ([]byte, []int) {
	return fileDescriptor_example_c8b6363476e787b3, []int{1}
}
func (m *Set) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Set.Unmarshal(m, b)
}
func (m *Set) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Set.Marshal(b, m, deterministic)
}
func (dst *Set) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Set.Merge(dst, src)
}
func (m *Set) XXX_Size() int {
	return xxx_messageInfo_Set.Size(m)
}
func (m *Set) XXX_DiscardUnknown() {
	xxx_messageInfo_Set.DiscardUnknown(m)
}

var xxx_messageInfo_Set proto.InternalMessageInfo

func (m *Set) GetId() uint32 {
	if m != nil && m.Id != nil {
		return *m.Id
	}
	return 0
}

func (m *Set) GetName() string {
	if m != nil && m.Name != nil {
		return *m.Name
	}
	return ""
}

func (m *Set) GetLdList() []*LD {
	if m != nil {
		return m.LdList
	}
	return nil
}

func init() {
	proto.RegisterType((*LD)(nil), "example.LD")
	proto.RegisterType((*Set)(nil), "example.Set")
}

func init() { proto.RegisterFile("example.proto", fileDescriptor_example_c8b6363476e787b3) }

var fileDescriptor_example_c8b6363476e787b3 = []byte{
	// 109 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xe2, 0x4d, 0xad, 0x48, 0xcc,
	0x2d, 0xc8, 0x49, 0xd5, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x87, 0x72, 0x95, 0x04, 0xb8,
	0x98, 0x7c, 0x5c, 0x84, 0xb8, 0xb8, 0x98, 0x32, 0x0b, 0x24, 0x18, 0x15, 0x98, 0x34, 0x78, 0x95,
	0x6c, 0xb9, 0x98, 0x83, 0x53, 0x4b, 0xc0, 0x42, 0x29, 0x10, 0x21, 0x21, 0x1e, 0x2e, 0x96, 0xbc,
	0xc4, 0xdc, 0x54, 0x09, 0x26, 0x20, 0x8f, 0x53, 0x48, 0x86, 0x8b, 0x3d, 0x27, 0x25, 0x3e, 0x27,
	0xb3, 0xb8, 0x44, 0x82, 0x59, 0x81, 0x59, 0x83, 0xdb, 0x88, 0x5b, 0x0f, 0x66, 0xb8, 0x8f, 0x0b,
	0x20, 0x00, 0x00, 0xff, 0xff, 0x2d, 0xbd, 0x0b, 0xe7, 0x69, 0x00, 0x00, 0x00,
}

特别注意: 生成的文件中的package是example, 那么文件必须放在example文件夹下! 否则会报错: “can’t load package: package example

三、写一个测试程序

package main

import (
	"fmt"
	t "./example"
	"github.com/golang/protobuf/proto"
)

func main() {
	var hw t.Set
	var ld t.LD

	ld = t.LD {
		Ip: proto.Uint32(666),
	}

	hw = t.Set {
		Id: proto.Uint32(1),
		Name: proto.String("hello"),
	}

	mData, err := proto.Marshal(&hw)

	if err != nil {
		fmt.Println("Error1:", err)
		return
	}

	var umData t.Set
	err = proto.Unmarshal(mData, &umData)

	if err != nil {
		fmt.Println("Error2:", err)
		return
	}

	fmt.Println(*umData.Id, " ", *umData.Name, " ", *ld.Ip)
}

四、编译运行

$ go build main.go
$ ./main
1   hello   666

本文转载自:https://blog.csdn.net/qq_15437667/article/details/78425151

共有 人打赏支持
科陆李明
粉丝 3
博文 28
码字总数 12864
作品 0
深圳
程序员
私信 提问
基于Go语言的protobuf 安装 以及简单测试用例

先去官网下载protobuf的源码 https://github.com/google/protobuf/releases 可以先下载本地,然后上传到虚拟机中 我选择的是Source code(tar.gz) 安装依赖包(如果缺少包,可能会报错) yum i...

故新
07/04
0
0
Derek解读Bytom源码-protobuf生成比原核心代码

作者:Derek 简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom 本章介绍bytom代码Api-Server接口服务 作者使用MacOS操作系统,其他平台...

比原链Bytom
08/23
0
0
Protobuf 作者不建议在 Deno 中使用 Protobuf

0. 背景 我之前在"如何评价ry(Ryan Dahl)的新项目deno?"的回答中曾经写到: 我比较好奇的是 deno 使用了 Protobuf,而没有使用 Mojo。既然目标是要兼容浏览器,却不使用 Mojo... ... 但是从 ...

justjavac
06/27
0
0
Protobuffer | PHP安装Google protobuf及使用

PHP安装Google protobuf及使用 备注 项目采用redis集群(主从方式)存储数据;数据量月增50W,单个数据序列化情况下达到2k,继续压缩数据解决空间. 项目服务采用PHP(版本5.3)作为RPC服务版本. pro...

云迹
2017/02/05
0
0
golang 第三方包的使用总结

golang 第三方包的安装的方法: 1. go get 安装 注意:执行go get 命令需要先安装git命令,并配置git全局变量。 2. 源码包安装 由于国内网络问题,很多时候go get命令并不能安装,所以就需要...

科陆李明
07/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MyBatis组件之缓存实现及使用

一 .概述 先讲缓存实现,主要是mybatis一级缓存,二级缓存及缓存使用后续补充 Mybatis缓存的实现是基于Map的,从缓存里面读写数据是缓存模块的核心基础功能; 除核心功能之外,有很多额外的附...

Ala6
19分钟前
0
0
SpringBoot中使用@RequestBody时如何自定义需要转换的日期格式

SpringBoot序列化和反序列化Json时默认使用的是Jackson(例如使用@RequestBody反序列化前端传递过来的Json字符串时), 当我们前端使用Json字符串传递到后台时日期格式可能是时间戳(即long类...

帅得拖网速
今天
1
0
可自定义扩展底部列表对话框ListBottomSheetDialogFragment

因为需要,为了方便,构建了一个可以自定义扩展的底部列表对话框,可以应付大部分场景。 效果图如下: 1.默认实现: 2.自定义列表实现 3.自定义头部和列表实现 一.可实现功能 1.默认可实现通...

明月春秋
今天
1
0
数据库---增删改查

增:insert into 表名(列名1,列名2) values(‘列值1’,‘列值2’) 多行数据处理:insert into 表名(列名1,列名2) select ‘列值1’,‘列值2’ union select ‘列值1.1’,‘列值2.2...

森林之下
今天
2
0
分布式/集群下session共享方案汇总

除去那些对容器依赖特别高的方案(如: 基于Tomcat的memcached-session-manager / tomcat-redis-session-manager,基于Jetty的jetty-nosql-memcache / jetty-session-redis ),自己整理了下...

哥本哈根的小哥
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部