Go Engineer Comprehensive Course: Protobuf Guide [Study Notes]

Protocol Buffers Getting Started Guide 1. Introduction Protocol Buffers (protobuf for short) is a language-agnostic, platform-agnostic, extensible structured data serialization mechanism developed by Google. Compared with serialization methods such as JSON and XML, protobuf is smaller, faster, and simpler. Project homepage: https://github.com/protocolbuffers/prot…

Protocol Buffers Getting Started Guide

1. Introduction

Protocol Buffers (protobuf for short) is a language-agnostic, platform-agnostic, extensible mechanism for serializing structured data developed by Google. Compared to serialization methods like JSON and XML, protobuf is smaller, faster, and simpler.

2. Installation

2.1 Install protoc Compiler

The protoc compiler is used to compile .proto files into source code for specific programming languages.

  1. Download the pre-compiled version suitable for your platform from https://github.com/protocolbuffers/protobuf/releases.
  2. After decompression, copy the protoc executable from the bin directory to a directory included in your system's PATH environment variable (e.g., /usr/local/bin).
  3. Verify installation:

bash
protoc --version

2.2 Install protobuf Runtime Environment

Different programming languages require the installation of their respective protobuf runtime environments. For example, for Go language:

go install google.golang.org/protobuf/cmd/protoc-gen-go@latest

Ensure that $GOPATH/bin is added to your system's PATH environment variable so that protoc can find the protoc-gen-go plugin.

3. Defining Message Types

Create a .proto file to define the data structure. For example, create student.proto:

syntax = "proto3";

package main;

message Student {
  string name = 1;
  bool male = 2;
  repeated int32 scores = 3;
}

Execute the following command in the current directory to generate Go language code:

protoc --go_out=. student.proto

This will generate the student.pb.go file, which contains the Go language implementation of the Student type.

4. Using Generated Code

In Go language, the generated code can be used for data serialization and deserialization.

package main

import (
  "fmt"
  "log"

  "google.golang.org/protobuf/proto"
)

func main() {
  student := &Student{
    Name:   "Alice",
    Male:   false,
    Scores: []int32{90, 95, 100},
  }

  // 序列化
  data, err := proto.Marshal(student)
  if err != nil {
    log.Fatal("Marshaling error: ", err)
  }

  // 反序列化
  newStudent := &Student{}
  err = proto.Unmarshal(data, newStudent)
  if err != nil {
    log.Fatal("Unmarshaling error: ", err)
  }

  fmt.Println("Student:", newStudent)
}

5. Field Rules

  • optional: Indicates that the field is optional; it can be set or left unset. If not set, it will be initialized with its default value.
  • repeated: Indicates that the field can be used any number of times, similar to a dynamic array.

Note: In proto3, the required keyword has been removed, and all fields are optional by default.

6. Enums and Nested Types

You can define enum types and nested message types in a .proto file. For example:

syntax = "proto3";

package main;

message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    string number = 1;
    PhoneType type = 2;
  }

  repeated PhoneNumber phones = 4;
}

7. Backward Compatibility

When updating .proto files, to maintain backward compatibility, you should follow these rules:

  • Do not change the field numbers of existing fields.
  • Do not delete existing fields.
  • You can add new fields, but they must use new numbers.
  • You can add new enum values.

Following these rules ensures that older code can still parse new message formats.

8. More Resources

主题测试文章,只做测试使用。发布者:Walker,转转请注明出处:https://walker-learn.xyz/archives/4460

(0)
Walker的头像Walker
上一篇 Mar 10, 2026 00:00
下一篇 Mar 8, 2026 15:40

Related Posts

  • In-depth Understanding of ES6 003 [Study Notes]

    Function parameter default values, as well as some details about the `arguments` object, how to use expressions as parameters, and the temporal dead zone for parameters. Previously, setting default values always relied on expressions containing the logical OR operator. When the preceding value was false, the latter value would always be returned. However, this became problematic if we passed 0 as an argument, requiring type verification. For example, `function makeRequest(url,timeout,callback){ timeout = t...`

    Personal Mar 8, 2025
    1.3K00
  • Go Engineering Systematic Course 014 [Study Notes]

    RocketMQ Quick Start. Go to our various configurations (podman) to see how it's installed. Introduction to Concepts: RocketMQ is a distributed messaging middleware open-sourced by Alibaba and an Apache top-level project. Core components: NameServer: Service discovery and routing; Broker: Message storage, delivery, and fetching; Producer: Message producer (sends messages); Consumer: Message consumer (subscribes to and consumes messages); Topic/Tag: Topic/...

    Personal Nov 25, 2025
    24300
  • Go Engineer System Course 005 [Learning Notes]

    For microservice development, create a microservice project where all project microservices will reside. Create `joyshop_srv`. We need to create user login and registration services, so we will create another directory `user_srv` under the project directory, along with `user_srv/global` (for global object creation and initialization), `user_srv/handler` (for business logic code), `user_srv/model` (for user-related models), `user_srv/pro...`

    Personal Nov 25, 2025
    29000
  • In-depth Understanding of ES6 008 [Study Notes]

    Iterators (Iterator) and Generators (Generator) are new features indispensable for efficient data processing. You will also find iterators present in other language features: the new for-of loop, the spread operator (...), and even asynchronous programming can use iterators. An iterator is a special object that has proprietary interfaces specifically designed for the iteration process. All iterator objects have a next() method, and each call returns a result pair...

    Personal Mar 8, 2025
    1.2K00
  • Fearless forward, fist power unleashed.

    Striving is an attitude. Life is like a competition with no shortcuts; only through continuous training, breaking through, and surpassing oneself can one stand on their own stage. This is not merely a contest, but rather a self-awakening—daring to face the fight, daring to challenge, and daring to become a stronger version of oneself. The Spirit of Striving in Sports. Whether it's boxing, running, or strength training, every punch thrown, every bead of sweat, every moment of gritting one's teeth and persevering, is a tempering of both body and mind. Striving is not merely a confrontation, but an attitude—facing challenges without backing down; facing failure, ...

    Personal Feb 26, 2025
    1.4K00
EN
简体中文 繁體中文 English