iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Golang安装和使用protocol-buffer流程介绍
  • 303
分享到

Golang安装和使用protocol-buffer流程介绍

2024-04-02 19:04:59 303人浏览 安东尼
摘要

目录前言安装protoc编译工具编写proto文件生成指定语言的proto文件调用proto制作插件前言 protocol buffer是Google发布的一种独立的数据交换格式,类

前言

protocol buffer是Google发布的一种独立的数据交换格式,类似于JSON,用于数据的序列化和解析。不同点是不能直接在各编程语言中使用,需要先在一个proto文件中定义需要传输的数据格式,然后使用proto工具把proto文件编译成想要的语言,如java、go、PHP等。然后在代码中,使用语言对应的protocol buffer包调用proto工具生成的文件,完成数据的序列化

安装protoc编译工具

首先安装protoc编译工具,在Http://GitHub.com/google/protobuf/releases,根据自己的系统选择包,下载后解压。我是win10 64,所以选择protoc-21.4-win64.zip,解压后放在了E盘。

添加环境变量,让系统命令可以识别protoc命令。

配置环境变量

PB_PATH=E:\protoc-3.21.4-win64

PATH=%PB_PATH%\bin

添加后,在命令行执行 protoc,返回信息,表示安装成功

编写proto文件

创建一个user.proto文件,该文件下可以定义一些user相关的需要加密的字段

//引入其他proto文件,就可以使用该文件中定义的message类型,定义本文件中的message下的字段
import "myproject/other_protos.proto";
// 指定的当前proto语法的版本
syntax = "proto3";
// 指定生成出来的文件的package,用来避免同一个文件调同名的消息时冲突
// 包说明符对生成代码的影响取决于您选择的语言,php会生成命名空间,go会生成package
package service;
//根据编程语言不同,参数名不同
//下面代码指定了生成go文件的生成目录,文件的包名。不设置包名时,包名默认为go文件所在目录名。会覆盖package设置的go的包名
//路径以执行命令的目录为当前目录,寻找相对路径
option go_package="./;service";
//定义消息类型,通过关键字message字段指定的,消息就是需要传输的数据格式的定义
message User {
// required必传;optional 可选;repeated 可重复初入。不写前缀默认为required
// 字段名后的数字不是默认值,是标识。标识号是[0,2^29-1]范围内的一个整数。[1-15]内的标识号在编码时只占用一个字节,包含标识符和字段类型,[16-2047]之间的标识符占用2个字节。建议为频繁出现的字段使用[1-15]间的标识符。
//字段类型除了除了常规类型,也可使用import引入文件中定义的message类型
	required string sername = 1;
	optional int32 age = 2;
	repeated int32 height = 3;
}
//定义服务类型,用作rpc通讯
service SearchService {
    //rpc 服务的函数名 (传入参数)返回(返回参数)
    //传入和返回参数,需要使用proto中定义的message
    rpc Search (SearchRequest) returns (SearchResponse);
}

生成指定语言的proto文件

protoc内置9中语言的编译插件,如下

我们以go为例。protoc没有内置go的编译器,需要引入外部插件protoc-gen-go

我们使用命令

go get github.com/golang/protobuf/protoc-gen-go

下载并编译了包,包中有main.go文件,所以在GOPATH/bin目录下生成了可执行文件protoc-gen-go.exe,这个文件就是我们在protoc中用到的插件

我们也可以自定义自己的插件。插件名必须以protoc-gen-插件名.exe命名

在调用时以:插件_out=参数 调用,之后回讲到如何制作插件

我们以go_out插件为例,执行命令

命令行后的第一个参数为输出目录。但是我们已经在go_package中指定了目录,所以第一个参数是无效的,填当前目录.即可。第二个参数是,要编译的文件路径和文件名(以命令执行目录为当前目录的相对路径)

protoc后可以追加1个或多个 -I=path 指定解析import指令时要在其中查找.proto文件的目录,若文件没有使用import,则不需要该参数

protoc --go_out=. proto_type/hello.proto

报错

protoc默认会从环境变量path下的路径中寻找插件,没找到报错。

查看发现path中只配置了go的安装GOROOT目录下的bin,而protoc-gen-go.exe在GOPATH的bin目录下

我们把protoc-gen-go.exe复制到GOROOT的bin目录下,即可。或者在环境变量path中添加gopath/bin目录。再次执行命令即可

调用proto

import (
	"fmt"
	"github.com/golang/protobuf/proto"
)
func main() {
	//定义一个要加密的变量
	msg := &protoc_type.User{
		Username:"zhangsan",
		Age:12,
	}
	//加密
	marshal,err := proto.Marshal(msg)
	if err!=nil{
		fmt.Println(err.Error())
	}else{
		fmt.Println(marshal)
	}
	//定义一个变量,用于接收解码的值,类型必须用加密的值类型一样
	unmarshal := &protoc_type.User{}
	//解码
	err2 := proto.Unmarshal(marshal,unmarshal)
	if err2 == nil{
		fmt.Println(unmarshal)
		fmt.Println(unmarshal.Username)
		fmt.Printf("%T",unmarshal)
	}
}	

制作插件

我们上文中提到,生成go用到了一个protoc的外部插件。插件的工作原理其实就是读取proto文件内容,并根据文件内容生成指定文件。文件中保存了定义的字段类型和方法之间的关系,以便编码和解码时使用

当我们在proto文件中定义了service,说明我们需要用到rpc服务。protoc内置的插件和一些官方的外部插件,只是提供了service中方法与参数类型的绑定,用于校验调用方法时类型是否正确。在service中定义的方法,我们需要自己创建。

当方法较多时,我们需要打开proto文件,一一对应的创建func,效率不高也容易出错。这种情况下,我们制作一个插件,读取service内容,自动创建方法,方法内的代码之后根据业务需求填充即可。

go官方提供了一个包,可以自动解析读取命令行传入proto文件,代码如下

package main
import (
	"fmt"
	"strings"
	"google.golang.org/protobuf/compiler/protogen"
)
type rpc struct{}
func main() {
	g := rpc{}
	protogen.Options{}.Run(g.Generate)
}
// Generate generate service code
func (md *rpc) Generate(plugin *protogen.Plugin) error {
	//遍历读取的命令行中传入的proto文件
	for _, f := range plugin.Files {
		//如果文件中没有定义service,跳过
		if len(f.Services) == 0 {
			continue
		}
		//根据proto文件名,生成一个自定义的文件,保存该proto中定义的func
		fileName := f.GeneratedFilenamePrefix + ".svr.go"
		//把该文件保存在proto文件的所在目录
		t := plugin.NewGeneratedFile(fileName, f.GoImportPath)
		//写入文字
		t.P("// Code generated by protoc-gen-tinyrpc.")
		//写入空行
		t.P()
		//写入包名
		pkg := fmt.Sprintf("package %s", f.GoPackageName)
		t.P(pkg)
		t.P()
		//遍历一个文件下所有service,自动生成方法
		for _, s := range f.Services {
			//插入注释,定义service类型
			serviceCode := fmt.Sprintf(`%stype %s struct{}`,
				getComments(s.Comments), s.Desc.Name())
			t.P(serviceCode)
			t.P()
			//遍历一个service下的方法,生成方法
			for _, m := range s.Methods {
				funcCode := fmt.Sprintf(`%sfunc(this *%s) %s(args *%s,reply *%s)error{
					// define your service ...
					return nil
				}
				`, getComments(m.Comments), s.Desc.Name(),
					m.Desc.Name(), m.Input.Desc.Name(), m.Output.Desc.Name())
				t.P(funcCode)
			}
		}
	}
	return nil
}
// getComments get comment details
func getComments(comments protogen.CommentSet) string {
	c := make([]string, 0)
	c = append(c, strings.Split(string(comments.Leading), "\n")...)
	c = append(c, strings.Split(string(comments.Trailing), "\n")...)
	res := ""
	for _, comment := range c {
		if strings.TrimSpace(comment) == "" {
			continue
		}
		res += "//" + comment + "\n"
	}
	return res
}

执行 go install 编译该文件,生成exe文件,文件名称设置为protoc-gen-gofunc.exe。然后再次执行protoc命令,如下

protoc --go_out=. proto_type/hello.proto --gofunc_out=. proto_type/hello.proto

执行后,会在proto_type目录下生成两个文件,hello.pd.go, hello.srv.go

到此这篇关于Golang安装和使用protocol-buffer方法介绍的文章就介绍到这了,更多相关Golang protocol-buffer内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: Golang安装和使用protocol-buffer流程介绍

本文链接: https://www.lsjlt.com/news/121201.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Golang安装和使用protocol-buffer流程介绍
    目录前言安装protoc编译工具编写proto文件生成指定语言的proto文件调用proto制作插件前言 protocol buffer是Google发布的一种独立的数据交换格式,类...
    99+
    2024-04-02
  • C++中Protocol Buffer怎么安装和使用
    要在C++中使用Protocol Buffer,您需要进行以下步骤来安装和使用它: 下载和安装 Protocol Buffer ...
    99+
    2023-10-23
    C++
  • 详细介绍Golang Iris框架的安装和使用
    随着互联网的快速发展,Web开发也变得越来越重要。在现代Web开发中,一个高效、功能强大的Web框架是必不可少的。Golang Iris 就是这样一个强大的Web框架,它能够让Web开发变得更加简单、高效。本文将详细介绍Golang Iri...
    99+
    2023-05-14
  • Tushare介绍、安装及使用教程
            本人是一个二本大数据的学生,想未来从事数据分析师的岗位。虽然说路漫漫道阻且长,但是我还是想跟大家分享一下平时做一些数据分析喜欢用的数据源,如果大家看完我的文章后,有什么不好的地方欢迎大家在评论区写下宝贵的意见,我看到都会积极...
    99+
    2023-10-08
    python
  • miniconda3介绍、安装以及使用教程
    目录简单来说conda有什么用?对于pip、conda、anaconda和miniconda的区别。安装环境配置测试安装第三方库Pycharm使用conda环境vscode使用con...
    99+
    2023-02-14
    miniconda安装 miniconda的安装与配置 miniconda安装教程
  • Jupyter 介绍、安装及使用
    Jupyter 介绍、安装及使用 一.Jupyter介绍 Jupyter Notebook是一个开源的web应用程序,可以使用它来创建和共享包含实时代码、方程、可视化和文本的文档。 Jupyter ...
    99+
    2023-09-05
    python
  • ubuntu安装postgresql和用法介绍
    这篇文章主要介绍“ubuntu安装postgresql和用法介绍”,在日常操作中,相信很多人在ubuntu安装postgresql和用法介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ubuntu安装pos...
    99+
    2023-06-13
  • Golang排序和查找使用方法介绍
    目录排序的介绍交换式排序法二维数组的介绍二维数组的应用场景二维数组快速入门二维数组的使用排序的介绍 排序是将一组数据,依指定的顺序进行排列的过程。 排序的分类: 1.内部排序: 指将...
    99+
    2022-12-16
    Golang排序和查找 Golang查找 Golang排序
  • golang RPC包原理和使用详细介绍
    目录工作流程工作模式http模式服务器模式本篇文章旨在通过学习rpc包和github上的一个rpc小项目,熟悉和学习golang中各个包的使用 工作流程 通过阅读官方文档,了解了rp...
    99+
    2024-04-02
  • 详细介绍GitLab的安装和配置过程
    在当今的软件开发领域,版本控制是一项非常重要的工作,而Git是这个领域中最为流行的版本控制系统之一。但是,为了更好地管理自己的项目,还需要搭建一套Git服务器来进行代码的提交和管理。其中,GitLab就是一个极好的选择。本文将详细介绍Git...
    99+
    2023-10-22
  • Python使用Selenium WebDriver的入门介绍及安装教程
    Selenium是一个用于自动化Web应用程序测试的工具,它可以模拟用户在浏览器中的操作,比如点击、填写表单、提交等。Python是...
    99+
    2023-08-22
    python
  • PythonFlask框架模块安装级使用介绍
    目录一、概述二、Flask 架构三、应用模块四、路由模块五、视图模块六、模板模块七、数据库模块1)安装 SQLAlchemy2)配置数据库连接3)定义数据库模型4)数据库操作八、表单...
    99+
    2023-03-03
    Python Flask框架模块 Python Flask
  • redis简单介绍及安装使用小结
    一:redis介绍 Redis和Memcached类似,也属于k-v数据存储 Redis官网redis.io, 当前最新稳定版4.0.1 支持更多value类型,除了和string外,还支持hash、li...
    99+
    2024-04-02
  • Golang中goroutine和channel使用介绍深入分析
    目录1.goroutine-看一个需求2.进程和线程介绍3.并发和并行4.Go协程和Go主线程5.设置Golang运行的CPU数6.channel(管道)看需求1.goroutine...
    99+
    2023-01-13
    Go goroutine与channel Go goroutine Go channel
  • 重点介绍Golang方法的语法和使用
    Golang作为一门比较年轻的语言,在方法中也有自己独特的实现方式。本文将重点介绍Golang方法的语法和使用。一、方法定义Golang中可以为任何类型定义方法,包括引用类型和非引用类型。方法定义格式如下:func (t Type) met...
    99+
    2023-05-14
  • AI 代码生成工具 Cursor 安装和使用介绍大全
    1: 概述 嘿,小伙伴们,听说你们要了解一款基于 AI 技术的代码生成工具 Cursor,让我们来一起看看如何安装和使用吧! Cursor 是一款基于 AI 技术的代码生成工具,它可以帮助开发人员自动生成代码,提高开发效率。下面是安装和使用...
    99+
    2023-08-18
    github java 开发语言
  • Py的ipykernel:Python库介绍、安装及使用攻略
    Py的ipykernel:Python库介绍、安装及使用攻略 ipykernel是一个用于在Jupyter Notebook中运行Python代码的包,它可以将Python代码转化为可以在IPytho...
    99+
    2023-09-07
    python 开发语言 linux
  • Pywifi:Python库pywifi的详细介绍、安装方法和使用攻略
    Pywifi:Python库pywifi的详细介绍、安装方法和使用攻略 一、简介 pywifi是一个用于操纵无线网络接口的Python软件包。通过pywifi,我们能够轻松地控制计算机上的Wi-Fi网...
    99+
    2023-10-24
    python 开发语言 linux
  • SpringCloud使用Feign实现远程调用流程详细介绍
    目录前言1. 导入依赖坐标2. 开启Feign自动装配3. 声明远程调用4. 替代RestTemplate5. 测试前言 本次示例代码的文件结构如下图所示。 1. 导入依赖坐标 在...
    99+
    2023-02-15
    SpringCloud Feign远程调用 SpringCloud Feign
  • Gin-高性能 Golang Web框架的介绍和使用
    偶遇 Gin 我之前一直在使用 Beego 框架来做应用的 Api,因为它的写法跟 PHP 的 MVC 一样,上手简单,所以对它的表现还算满意。用的久了,发现 Beego 的编程思想就是照搬了 PHP 的那一套,写法上倒没什么,但是在...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作