上一篇文章(大约半年前写的):https://www.cnblogs.com/cgzl/p/11246324.html

建立Go项目

在GOPATH的src下面建立一个文件夹 protobuf-go,然后在里面执行命令
go mod init github.com/solenovex/protobuf-go

这个命令是用来初始化go module的。
命令执行后在该目录生成go.mod文件,其内容如下:
其实直接执行go mod init 也行,默认会取当前文件夹的名字作为项目名。
 
如果你使用的是Goland,那么需要启用Go modules集成:
 
然后我们需要安装Protocol buffer的 Go 支持库:
go get -u github.com/golang/protobuf/protoc-gen-go

安装好之后:
下面会出现require github.com/…. 后边显示indirect,说明我们的代码还没有对其进行直接引用

 
建立main.go,代码如下:
 
然后执行命令 go run main.go 如果输出 "hello world!" 就说明一切正常。

 

建立proto

在项目下建立src/first文件夹,在里面建立person.proto文件:
 
下面需要通过这个proto文件,生成go的代码,命令行执行:
protoc --proto_path src/ --go_out=src/ src/first/person.proto
 
执行完之后,在src/first文件夹下会生成一个文件person.pb.go:
 
我们看一下这个文件里的PersonMessage 这个struct:
这里面前4个属性就是proto文件里面定义的那4个属性,每个属性后边都跟着一个字符串tags,它里面提供了一些反射需要的信息。

例如id属性后边这个:
它表示:
  • 针对protocol buffer转换,它的类型是varint,tag为1,opt应该是proto2里面遗留下来的东西不用去管,名子为id,协议是proto3.
  • 针对json序列化,它的名为id,omitempty大概可以理解为如果值为该类型的默认值,那么id这个key就会被忽略掉。
该文件里面的其余内容我就不介绍了,但是注意,这个文件不可以修改!

 

使用proto生成的代码

在main.go里面建立一个新的函数NewPersonMessage,然后main函数调用它:
在NewPersonMessage函数里面,我们New了一个生成文件里面的PersonMessage这个struct,并把4个属性赋了值,最后把它赋给变量pm。
可以通过pm.xx属性来修改它的值,也可以通过pm.GetXx()来获取其属性的值。
 
执行go run main.go之后结果如下:
 
修改package名
proto生成的go文件的package名并不是很符合约定,有一种约定是proto生成的go文件的package名应该以诗上层目录名+pb:
 
所以我可以修改proto文件,添加一个option:
option go_package 的值就是 生成go文件的package名。
 
再次执行:
protoc --proto_path src/ --go_out=src/ src/first/person.proto
 
这次生成的go文件的package就是:

把数据写入到文件

下面把NewPersonMessage添加一个返回类型:
返回PersonMessage的指针。

 
然后在main函数里通过NewPersonMessage函数获取一个PersonMessage,然后再建立一个writeToFile函数,把数据写入到文件里:
这里面writeToFile函数的第一个参数是文件名,第二个参数是proto.Message类型,它是一个接口,其代码如下:

 
而person.proto生成的PersonMessage struct正好拥有这些方法,所以它就是实现了该接口,所以在main在调用writeToFile函数的时候,可以将PersonMessage传递进去。

writeToFile里面的代码很简单,就是把数据写入到制定的文件里,文件权限模式为0644。

然后执行 go run main.go 会生成person.bin文件:
它是个二进制文件,编辑器无法打开查看内容。
 

从文件读取数据

添加一个readFromFile函数,用来从文件读取数据:
 
然后在main函数里面new一个PersonMessage的指针,它的各属性值都没填,把这个指针传入到readFromFile函数里面,在里面使用proto.Unmarshal方法把数据写入到该指针指向的struct里面。
最后在main函数里进行打印,其结果如下:
 

gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go语言的例子(上)的更多相关文章

  1. gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go语言的例子(下)

    第一篇文章(大约半年前写的):https://www.cnblogs.com/cgzl/p/11246324.html gRPC in ASP.NET Core 3.x -- Protocol Buf ...

  2. gRPC in ASP.NET Core 3.x -- Protocol Buffer(3)更新消息类型

    当你第一次定义Protocol Buffer的消息的时候,你肯定会给消息设定一套规则需求.但是随着时间的推进,你的业务可能会发生了变化,与此同时,你的Protocol Buffer消息类型的需求也会随 ...

  3. gRPC in ASP.NET Core 3.0 -- Protocol Buffer(1)

    现如今微服务很流行,而微服务很有可能是使用不同语言进行构建的.而微服务之间通常需要相互通信,所以微服务之间必须在以下几个方面达成共识: 需要使用某种API 数据格式 错误的模式 负载均衡 ... 现在 ...

  4. gRPC在 ASP.NET Core 中应用学习(二)

    前言: 上一篇文章中简单的对gRPC进行了简单了解,并实现了gRPC在ASP.NET Core中服务实现.客户端调用:那么本篇继续对gRPC的4中服务方法定义.其他使用注意点进一步了解学习 一.gRP ...

  5. gRPC in ASP.NET Core 3.x - gRPC 简介

    gRPC的结构 在我们搭建gRPC通信系统之前,首先需要知道gRPC的结构组成. 首先,需要一个server(服务器),它用来接收和处理请求,然后返回响应. 既然有server,那么肯定有client ...

  6. 【原生态跨平台:ASP.NET Core 1.0(非Mono)在 Ubuntu 14.04 服务器上一对一的配置实现-篇幅1】

    鸡冻人心的2016,微软高产年. build 2016后 各种干货层出不穷. 1 Win10 集成了bash  ,实现了纳德拉的成诺,Microsoft Love Linux!!! 2 跨平台  ,收 ...

  7. 002.Create a web API with ASP.NET Core MVC and Visual Studio for Windows -- 【在windows上用vs与asp.net core mvc 创建一个 web api 程序】

    Create a web API with ASP.NET Core MVC and Visual Studio for Windows 在windows上用vs与asp.net core mvc 创 ...

  8. 004.Create a web app with ASP.NET Core MVC using Visual Studio on Windows --【在 windows上用VS创建mvc web app】

    Create a web app with ASP.NET Core MVC using Visual Studio on Windows 在 windows上用VS创建mvc web app 201 ...

  9. Asp.Net Core中配置使用Kindeditor富文本编辑器实现图片上传和截图上传及文件管理和上传(开源代码.net core3.0)

    KindEditor使用JavaScript编写,可以无缝的于Java..NET.PHP.ASP等程序接合. KindEditor非常适合在CMS.商城.论坛.博客.Wiki.电子邮件等互联网应用上使 ...

随机推荐

  1. OpenVINO 入门

    关于OpenVINO 入门,今天给大家分享一个好东西和好消息! 现如今,说人工智能(AI)正在重塑我们的各行各业绝不虚假,深度学习神经网络的研究可谓如火如荼, 但这一流程却相当复杂,但对于初学者来说也 ...

  2. 【题解】BZOJ4883: [Lydsy1705月赛]棋盘上的守卫(最小生成基环森林)

    [题解]BZOJ4883: [Lydsy1705月赛]棋盘上的守卫(最小生成基环森林) 神题 我的想法是,每行每列都要有匹配且一个点只能匹配一个,于是就把格点和每行每列建点出来做一个最小生成树,但是不 ...

  3. 基于js的APP多语言处理

    本文出自APICloud官方论坛, 感谢论坛版主哼哼哈兮 的分享.   本期分享一个js的多语言处理插件i18n.js,此插件是基于JQuery.i18n.properties修改而来的. 实现的原理 ...

  4. spark和strom优劣分析

    对于Storm来说:1.建议在那种需要纯实时,不能忍受1秒以上延迟的场景下使用,比如实时金融系统,要求纯实时进行金融交易和分析2.此外,如果对于实时计算的功能中,要求可靠的事务机制和可靠性机制,即数据 ...

  5. java实现FTP文件下载

    package com.vingsoft.util;/*** @author 作者:dujj* @version 创建时间:2020年1月13日 下午5:53:39*/import java.io.F ...

  6. Vue中的nextTick()浅析

    引言 在开发过程中,我们经常遇到这样的问题:我明明已经更新了数据,为什么当我获取某个节点的数据时,却还是更新前的数据? 一,浅析 为什么会这样呢?带着这个疑问先往下看. 先看一个小的例子: <d ...

  7. 本地缓存google.guava及分布式缓存redis 随笔

    近期项目用到了缓存,我选用的是主流的google.guava作本地缓存,redis作分布式 缓存,先说说我对本地缓存和分布式缓存的理解吧,可能不太成熟的地方,大家指出,一起 学习.本地缓存的特点是速度 ...

  8. Jenkins自动执行python脚本输出测试报告

    前言 在用python做自动化测试时,我们写好代码,然后需要执行才能得到测试报告,这时我们可以通过 Jenkins 来进一步完成自动化工作. 借助Jenkins,我们可以结合 Git/SVN 自动拉取 ...

  9. Java入门 - 语言基础 - 13.Character类

    原文地址:http://www.work100.net/training/java-character.html 更多教程:光束云 - 免费课程 Character类 序号 文内章节 视频 1 概述 ...

  10. 异数OS 织梦师-Xnign(四)-- 挑战100倍速Nginx,脚踩F5硬件负载均衡

    . 异数OS 织梦师-Xnign(四)– 挑战100倍速Nginx,脚踩F5硬件负载均衡 本文来自异数OS社区 github: https://github.com/yds086/HereticOS ...