c语言编程笔录

首页 >   > 笔记大全

笔记大全

golang 安装 protoc

更新时间:2023-10-22

什么是 Protobuf?

Protobuf(全称为 Protocol Buffers)是一种轻便高效的数据存储格式,以及用于通信协议的格式,由 Google 开发并开源。与 XML 和 JSON 不同,Protobuf 是一种二进制格式,其优势在于占用空间小、解析速度快、可扩展性强。这些优点也使得 Protobuf 变得越来越受欢迎。

然而,Protobuf 本身是一种数据格式,要想在程序中使用它,需要一个对应的解析器。本文将介绍如何在 Go 语言中安装 protoc,从而在代码中使用 Protobuf 格式。

安装 protoc

protoc 是 Protocol Buffers 的编译器,在使用 Protocol Buffers 格式时,需要将其编译成相应语言的代码。下面介绍如何在 Go 语言中安装 protoc。

第一步,从官网下载 protoc 的最新版本:https://github.com/protocolbuffers/protobuf/releases。

  $ wget https://github.com/protocolbuffers/protobuf/releases/download/3.17.3/protobuf-all-3.17.3.zip

第二步,解压下载下来的 zip 包并进入解压后的目录。然后将 bin 目录添加到 PATH 环境变量中,这样就可以全局使用 protoc 命令了。

  $ unzip protobuf-all-3.17.3.zip
  $ cd protobuf-all-3.17.3
  $ export PATH=$PATH:`pwd`/bin

使用 protoc 编译 proto 文件

使用 Protocol Buffers 格式时,需要将 .proto 文件编译成 Go 语言中可以使用的代码。下面介绍如何使用 protoc 编译 proto 文件。

假设有以下 .proto 文件,文件名为 message.proto:

  syntax = "proto3";
  package main;

  message SimpleMessage {
    string id = 1;
    string name = 2;
  }

使用以下命令可以将 message.proto 编译成 Go 语言中使用的代码。需要指定输出目录和使用的语言,此处为 Go 语言。

  $ protoc --go_out=. message.proto

此时会在当前目录生成一个 message.pb.go 文件,该文件包含了 SimpleMessage 结构体的定义和一些编解码方法,可以在 Go 语言代码中使用。

在 Go 语言代码中使用 Protobuf 格式

编译完 .proto 文件后,就可以在 Go 语言代码中使用编译后的代码了。下面简单介绍一下如何在 Go 中使用 Protobuf 格式。

首先,在 Go 代码中引入刚刚编译的 message.pb.go 文件:

  import (
    "fmt"
    "github.com/golang/protobuf/proto"
    "path/to/message.pb"
  )

这个时候就可以使用 SimpleMessage 结构体了。例如,可以使用以下代码创建一个 SimpleMessage 实例并进行编码:

  message := &main.SimpleMessage{
    Id: "123",
    Name: "Simple Message",
  }
  data, err := proto.Marshal(message)
  if err != nil {
    fmt.Println("Error: ", err)
  }

在这个例子中,首先使用 SimpleMessage 结构体创建了一个 message 实例,然后使用 proto.Marshal() 方法将 message 编码成二进制格式。如果出现编码错误,就会输出错误信息。

同样地,可以使用 proto.Unmarshal() 方法将二进制格式解码成 SimpleMessage 结构体:

  message := &main.SimpleMessage{}
  err := proto.Unmarshal(data, message)
  if err != nil {
    fmt.Println("Error: ", err)
  }

这个例子中,首先创建一个空的 SimpleMessage 实例,然后使用 proto.Unmarshal() 方法将 data 解码到 message 中。如果出现解码错误,就会输出错误信息。