gRPC in ASP.NET Core 3.x — Protocol Buffer(2)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!” 就说明一切正常。

在项目下建立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就会被忽略掉。

该文件里面的其余内容我就不介绍了,但是注意,这个文件不可以修改!

在main.go里面建立一个新的函数NewPersonMessage,然后main函数调用它:

可以通过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函数里进行打印,其结果如下:

Original: https://www.cnblogs.com/yangxu-pro/p/12296678.html
Author: yangxu-pro
Title: gRPC in ASP.NET Core 3.x — Protocol Buffer(2)Go语言的例子(上)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/535804/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • gRPC,爆赞

    gRPC 这项技术真是太棒了,接口约束严格,性能还高,在 k8s 和很多微服务框架中都有应用。 作为一名程序员,学就对了。 之前用 Python 写过一些 gRPC 服务,现在准备…

    Go语言 2023年5月25日
    052
  • 常见的限流算法

    通过限制并发访问数或者限制一个时间窗口内允许处理的请求数量来保护系统,例如,通过限流,你可以过滤掉产生流量峰值的客户和服务。 令牌桶算法 令牌桶算法是常见的一种限流算法。假设有一个…

    Go语言 2023年5月25日
    049
  • Go 语言实现 gRPC 的发布订阅模式,REST 接口和超时控制

    在多个平台的阅读量都创了新高,在 oschina 更是获得了首页推荐,阅读量到了 1w+,这已经是我单篇阅读的高峰了。 看来只要用心写还是有收获的。 这篇咱们还是从实战出发,主要介…

    Go语言 2023年5月25日
    062
  • go-micro集成链路跟踪的方法和中间件原理

    前几天有个同学想了解下如何在go-micro中做链路跟踪,这几天正好看到wrapper这块,wrapper这个东西在某些框架中也称为中间件,里边有个opentracing的插件,正…

    Go语言 2023年5月25日
    055
  • Golang开源流媒体服务器(RTMP/RTSP/HLS/FLV等协议)

    一. lal 简介 lal是开源直播流媒体网络传输项目,主要由三部分组成: lalserver:流媒体转发服务器。类似于 nginx-rtmp-module等服务,但支持更多的协议…

    Go语言 2023年5月25日
    060
  • 为什么要避免在 Go 中使用 ioutil.ReadAll?

    原文链接: 为什么要避免在 Go 中使用 ioutil.ReadAll? ioutil.ReadAll 主要的作用是从一个 io.Reader 中读取所有数据,直到结尾。 在 Gi…

    Go语言 2023年5月25日
    041
  • Go内存逃逸分析

    Go的内存逃逸及逃逸分析 Go的内存逃逸 分析内存逃逸之前要搞清楚一件事 我们编写的程序中的 函数和 局部变量默认是存放在栈上的(补充一点堆上存储的数据的指针 是存放在栈上的 因为…

    Go语言 2023年5月25日
    042
  • 使用 grpcurl 通过命令行访问 gRPC 服务

    如果环境不支持安装这种 GUI 客户端的话,那么有没有一种工具,类似于 curl 这样的,直接通过终端,在命令行发起请求呢? 答案肯定是有的,就是本文要介绍的 grpcurl。 首…

    Go语言 2023年5月25日
    074
  • 支持首次触发的 Go Ticker

    促使我写这篇文章主要是在写一个关于虚拟货币账户监控的项目时使用 Ticker 的问题。 Ticker 的问题 如果用过 Ticker 的朋友会知道,创建 Ticker 后并不会马上…

    Go语言 2023年5月25日
    062
  • go微服务框架Kratos笔记(六)链路追踪实战

    什么是链路追踪 借用阿里云链路追踪文档来解释分布式链路追踪(Distributed Tracing),也叫 分布式链路跟踪,分布式跟踪,分布式追踪 等等,它为分布式应用的开发者提供…

    Go语言 2023年5月25日
    057
  • go语言学习笔记

    最近一直在学习go语言,因此打算学习的时候能够记录一下笔记。我这个人之前是从来没有记录笔记的习惯,一直以来都是靠强大的记忆力去把一些要点记住。读书的时候因为一直都是有一个很安静和很…

    Go语言 2023年5月29日
    046
  • golang实现一个简单的websocket聊天室

    基本原理:1.引入了 golang.org/x/net/websocket 包。2.监听端口。3.客户端连接时,发送结构体: {“type”:”…

    Go语言 2023年5月25日
    062
  • 生产者消费者模型及Golang简单实现

    简介:介绍生产者消费者模型,及go简单实现的demo。 一、生产者消费者模型 生产者消费者模型:某个模块(函数等〉负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,…

    Go语言 2023年5月25日
    043
  • 微服务-限流:一.golang实现令牌桶算法

    起初是因为要去拉取一些第三方的数据,而第三方的API接口都有限流措施。比如6000/分钟,500/分钟。想着拉取数据就用多个协程的方式。但是容易超频,所以想着写一个限流的东东。网上…

    Go语言 2023年5月25日
    043
  • golang 标准库template的代码生成

    最近,随着 antd Pro v5 的升级,将项目进行了升级,现在生成的都是 ts 代码。这个项目的自动生成代码都是基于 golang 的标准库 template 的,所以这篇博客…

    Go语言 2023年5月25日
    039
  • 【golang】分布式缓存 – 一致性哈希算法

    之前也了解到过一致性哈希算法,但是没有用go实现过,刚好最近看GeeCache,动手实现下一致性哈希算法 正文: 我们先来想下一致性哈希算法的数据结构含有哪些内容: 1.map 用…

    Go语言 2023年5月25日
    052
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球