之前的文章中已经展示过如何在C++中使用protobuf,本文将简单示范protobuf在Golang和Python中的使用。

Talk is cheap. Show you my code.

首先是Python:

import addressbook_pb2
import random
import uuid def Home():
return addressbook_pb2.Person.HOME def Work():
return addressbook_pb2.Person.WORK def Mobile():
return addressbook_pb2.Person.MOBILE switch = {0: Mobile(), 1: Home(), 2: Work()} # from protobuf to string def Write2AB(addressbook):
for i in range(20):
person = addressbook.people.add()
person.id = i
person.name = 'name: ' + str(i)
person.email = str(i) + '@eamil.com' phone = person.phones.add()
phone.type = switch[random.randint(0, 999) % 3]
phone.number = str(uuid.uuid1()) return addressbook.SerializeToString() def ReadFromAB(addressbook):
i = 1
for people in addressbook.people:
print('\n====== {} ======'.format(i))
print('Person ID: ', people.id)
print('Person Name: ', people.name)
print('Person Email: ', people.email) print('Person PhoneNumber:')
for phone in people.phones:
if phone.type == addressbook_pb2.Person.MOBILE:
print('\t type:Mobile number:{}'.format(phone.number))
elif phone.type == addressbook_pb2.Person.HOME:
print('\t type:Home number:{}'.format(phone.number))
if phone.type == addressbook_pb2.Person.WORK:
print('\t type:work number:{}'.format(phone.number))
i += 1 if __name__ == "__main__":
ab = addressbook_pb2.AddressBook()
abString = Write2AB(ab)
print(abString) # from string to protobuf
ab.ParseFromString(abString)
ReadFromAB(ab)

接下来是Golang:

package main

import (
"fmt"
"strconv" uuid "github.com/satori/go.uuid" "github.com/golang/protobuf/proto"
"github.com/zj/tutorial"
) // Write2AB return []byte from protobuf
func Write2AB(ab *tutorial.AddressBook) ([]byte, error) {
for i := 0; i < 10; i++ {
person := &tutorial.Person{}
person.Id = int32(i)
person.Name = "name" + strconv.Itoa(i)
person.Email = strconv.Itoa(i) + "@email.com" phone := &tutorial.Person_PhoneNumber{}
switch i % 3 {
case 0:
phone.Type = tutorial.Person_MOBILE
case 2:
phone.Type = tutorial.Person_WORK
default:
phone.Type = tutorial.Person_HOME
}
phone.Number = uuid.Must(uuid.NewV4()).String() person.Phones = append(person.Phones, phone) ab.People = append(ab.People, person)
} return proto.Marshal(ab) } // ReadFromBytes read addressbook from []byte
func ReadFromBytes(abByte []byte) (*tutorial.AddressBook, error) {
ab := &tutorial.AddressBook{}
err := proto.Unmarshal(abByte, ab)
if err != nil {
return nil, err
}
return ab, nil
} func main() {
ab := &tutorial.AddressBook{} abBytes, err := Write2AB(ab)
if err != nil {
fmt.Println(err)
return
} ab, err = ReadFromBytes(abBytes)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(ab)
}

本文采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。

Protobuf示例:Golang and Python的更多相关文章

  1. 2017年的golang、python、php、c++、c、java、Nodejs性能对比(golang python php c++ java Nodejs Performance)

    2017年的golang.python.php.c++.c.java.Nodejs性能对比 本人在PHP/C++/Go/Py时,突发奇想,想把最近主流的编程语言性能作个简单的比较, 至于怎么比,还是不 ...

  2. 2017年的golang、python、php、c++、c、java、Nodejs性能对比[续]

    2017年的golang.python.php.c++.c.java.Nodejs性能对比[续] 最近忙,这个话题放了几天,今天来个续集.   上篇传送门: 2017年的golang.python.p ...

  3. golang与python多线程的并发速度

    一.golang的代码 package main import ( "fmt" "time" ) func Text_goroute(a int, b int) ...

  4. 2018-06-21 中文代码示例视频演示Python入门教程第五章 数据结构

    知乎原链 续前作: 中文代码示例视频演示Python入门教程第四章 控制流 对应在线文档: 5. Data Structures 这一章起初还是采取了尽量与原例程相近的汉化方式, 但有些语义较偏(如T ...

  5. 2018-06-20 中文代码示例视频演示Python入门教程第四章 控制流

    知乎原链 续前作: 中文代码示例视频演示Python入门教程第三章 简介Python 对应在线文档: 4. More Control Flow Tools 录制中出了不少岔子. 另外, 输入法确实是一 ...

  6. 想涨工资吗?那就学习Scala,Golang或Python吧

    [编者按]据薪水调查机构 PayScale 提供的数据显示,掌握 Scala,Golang 和 Python 语言以及诸如 Apache Spark 之类的大数据技术,能带来最大的薪水提升.本文作者为 ...

  7. golang和python互相调用

    http://blog.yuanzhaoyi.cn/2018/06/27/golang_python.html python3-ctypes: https://docs.python.org/3.5/ ...

  8. Golang调用Python

    https://yq.aliyun.com/articles/117329 Python是时髦的机器学习御用开发语言,Golang是大红大紫的新时代后端开发语言.Python很适合让搞算法的写写模型, ...

  9. DES对称加密算法实现:Java,C#,Golang,Python

    数据加密标准(DES,Data Encryption Standard,简写DES)是一种采用块密码加密的对称密钥算法,加密分组长度为64位,其中8.16.24.32.40.48.56.64 等8位是 ...

  10. 2018-06-20 中文代码示例视频演示Python入门教程第三章 简介Python

    知乎原链 Python 3.6.5官方入门教程中示例代码汉化后演示 对应在线文档: 3. An Informal Introduction to Python 不知如何合集, 请指教. 中文代码示例P ...

随机推荐

  1. OpenvSwitch系列之十一 ovs-dpdk

    Open vSwitch系列之一 Open vSwitch诞生 Open vSwitch系列之二 安装指定版本ovs Open vSwitch系列之三 ovs-vsctl命令使用 Open vSwit ...

  2. Docker 与 Linux Cgroups:资源隔离的魔法之旅

    这篇文章主要介绍了 Docker 如何利用 Linux 的 Control Groups(cgroups)实现容器的资源隔离和管理. 最后通过简单 Demo 演示了如何使用 Go 和 cgroups ...

  3. WebSoket 的广泛应用

    目前大多数网站都在使用的传统 HTTP 协议,即由 Web 服务器通过 HTTP 接收并响应来自客户端的消息,整个发起请求与响应的过程类似我们点外卖,由以下 2 部分构成: 下订单(发起请求):用户( ...

  4. 【HZERO】消息发送

    消息发送 https://open.hand-china.com/community/detail/625843016338378752 新建模板 @Override public String sh ...

  5. 【HZERO】报表服务

    报表服务 参考文档 https://open.hand-china.com/document-center/doc/component/181/12455?doc_id=10088&_back ...

  6. SpringBoot 项目实战 | 瑞吉外卖 Day04

    该系列将记录一份完整的实战项目的完成过程,该篇属于第四天 案例来自B站黑马程序员Java项目实战<瑞吉外卖>,请结合课程资料阅读以下内容 该篇我们将完成以下内容: 文件上传下载 新增菜品 ...

  7. C++实现简单的日期正则表达式

    简单的日期正则表达式 一个简单的日期解析程序,从yyyy-mm-dd格式的日期字符串中,分别获取年月日. 先设置一个简单的正则表达式,4位数字的"年",1-2位数字的"月 ...

  8. 四、java对mongo数据库增删改查操作

    系列导航 一.linux单机版mongo安装(带密码验证) 二.mongo集群搭建 三.java连接mongo数据库 四.java对mongo数据库增删改查操作 五.mongo备份篇 mongoexp ...

  9. vue中class样式与内联样式

    (1):style使用 <div class="score" :style="{ color: colorComputed(item.status) }" ...

  10. joi