文档章节

golang使用protobuf简易教程

科陆李明
 科陆李明
发布于 08/16 23:28
字数 760
阅读 105
收藏 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
博文 23
码字总数 9913
作品 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
google protobuf3简易教程

版权声明:本文为博主原创文章,欢迎大家讨论,未经博主允许不得转载. https://blog.csdn.net/u010398771/article/details/82077915 google 的 protobuf 一个及其快速,以及好用的序列化框架,支...

长河
08/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Sql语言与MySql数据库

1. 数据库简介 1. 数据库,就是存储数据的仓库,只能通过sql语言来访问,数据库也是一个文件系统。通常,MySQL、Oracle等数据库,也被称为关系型数据库,其保存的不仅仅只是数据,还包括数据...

江左煤郎
29分钟前
0
0
IDEA 取消自动import .*

打开设置 > Editor > Code Style > Java > Scheme Default > Imports ① 将 Class count to use import with "*" 改为 99 (导入同一个包的类超过这个数值自动变为 * ) ② 将 Names count ......

乔老哥
30分钟前
1
0
PostGIS学习笔记(开篇)

PostGIS事实上算是笔者开始写博客的第一篇内容。而事实上那篇博文的内容并不丰富,笔者对PostGIS的了解仍然不多,然而17年在OSGeo课程学习时对PostGIS又有了进一步了解,并逐步发现它的强大。...

胖胖雕
30分钟前
1
0
【Centos】在nginx服务器中配置php和mysql

接上一章《【Centos】利用Vultr服务器和namesilo布网》(https://my.oschina.net/u/3776619/blog/2051986),在Centos中配置好nginx,并在iptables中开启了80端口,和为了远程mysql操作方便开...

yongh701
54分钟前
3
0
flume -- fileChannel简要分析其过程

flume之event写入FileChannel doPut(event)-->获取共享锁后[log.lockShared();]-->FlumeEventPointer ptr = log.put(transactionID, event); 此处的log.put即将transactionID及event进行后续......

-九天-
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部