欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang中protobuf的使用詳解

 更新時間:2023年10月20日 10:26:57   作者:碼說AI  
protobuf是Google公司提出的一種輕便高效的結(jié)構(gòu)化數(shù)據(jù)存儲格式,常用于結(jié)構(gòu)化數(shù)據(jù)的序列化,具有語言無關(guān)、平臺無關(guān)、可擴展性特性,常用于通訊協(xié)議、服務(wù)端數(shù)據(jù)交換場景,下面我們就來看看golang中protobuf的具體使用吧

前言

protobuf是Google公司提出的一種輕便高效的結(jié)構(gòu)化數(shù)據(jù)存儲格式,常用于結(jié)構(gòu)化數(shù)據(jù)的序列化,具有語言無關(guān)、平臺無關(guān)、可擴展性特性,常用于通訊協(xié)議、服務(wù)端數(shù)據(jù)交換場景。

protobuf的核心內(nèi)容包括:

  • 定義消息:消息的結(jié)構(gòu)體,以message標識。
  • 定義接口:接口路徑和參數(shù),以service標識。

通過protobuf提供的機制,服務(wù)端與服務(wù)端之間只需要關(guān)注接口方法名(service)和參數(shù)(message)即可通信,而不需關(guān)注繁瑣的鏈路協(xié)議和字段解析,極大降低了服務(wù)端的設(shè)計開發(fā)成本。

1、protobuf配置

(1)https://github.com/protocolbuffers/protobuf/releases

(2)選擇適合的版本:protoc-3.8.0-win64.zip

(3)解壓后將文件 protoc.exe 所在目錄添加到環(huán)境變量 Path

(4)檢查protobuf版本,CMD命令窗口執(zhí)行:protoc --version

2、proto文件處理

(1)獲取相關(guān)庫

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

(2)編寫test.proto文件

//指定版本
syntax = "proto3";
//包名
package pb;
//課程
message Course{
    int32 id = 1;
    string name = 2;
}
//學生
message Student{
    int32 id = 1;
    string name = 2;
    repeated Course courses = 3;
}

(3)生成文件命令:protoc --go_out=. test.proto

命令執(zhí)行完,會在test.proto同級目錄下生成test.pb.go文件

3、使用

package main
 
import (
    "fmt"
    "log"
    "test/protobuf/pb"
 
    "github.com/golang/protobuf/proto"
)
 
func main() {
    course1 := pb.Course{
        Id:   *proto.Int32(1),
        Name: *proto.String("Golang"),
    }
    course2 := pb.Course{
        Id:   *proto.Int32(2),
        Name: *proto.String("Python3"),
    }
    stu := pb.Student{
        Id:      *proto.Int32(1),
        Name:    *proto.String("篤志弘毅"),
        Courses: []*pb.Course{&course1, &course2},
    }
    //序列化
    data, err := proto.Marshal(&stu)
    if err != nil {
        log.Fatalln("proto.Marshal err:", err)
    }
    fmt.Println(data)
    //反序列化
    var stuNew pb.Student
    err = proto.Unmarshal(data, &stuNew)
    if err != nil {
        log.Fatalln("proto.Unmarshal err:", err)
    }
    fmt.Println(stuNew)
}

問題解決:編譯go版本proto3出現(xiàn)"go_package"錯誤

在使用protobuf2升到protobuf3時,更新了proto-gen-go,編譯proto文件進報了錯誤

protoc-gen-go: unable to determine Go import path for "proto/ipc.proto"
 
Please specify either:
        • a "go_package" option in the .proto source file, or
        • a "M" argument on the command line.
 
See https://developers.google.com/protocol-buffers/docs/reference/go-generated#package for more information.
 
--go_out: protoc-gen-go: Plugin failed with status code 1.

源文件為:

syntax = "proto3";
 
package ipc;
 
// 長連接Token驗證請求
message GameAuthReq {
    string authToken = 1;   // Token
    string serverId = 2;    // 登錄服務(wù)器ID
}
 
...

編譯命令為:

protoc --go_out=. proto/ipc.proto
protoc-gen-go v1.27.1
protoc v3.12.3

原因是protoc-gen-go版本過高,對源proto文件需要添加包名。在proto文件中添加option go_package = "/ipc";就可以解決了。

syntax = "proto3";
 
package ipc;
option go_package = "/ipc";
 
// 長連接Token驗證請求
message GameAuthReq {
    string authToken = 1;   // Token
    string serverId = 2;    // 登錄服務(wù)器ID
}
 
...

還有一種解決辦法就是把protoc-gen-go版本退回到1.3.2及以下也可以解決。

到此這篇關(guān)于golang中protobuf的使用詳解的文章就介紹到這了,更多相關(guān)go protobuf內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang time包做時間轉(zhuǎn)換操作

    golang time包做時間轉(zhuǎn)換操作

    這篇文章主要介紹了golang time包做時間轉(zhuǎn)換操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go log庫的使用示例詳解

    Go log庫的使用示例詳解

    Go語言內(nèi)置的log庫提供了基本的日志記錄功能,支持日志的格式化輸出、設(shè)置日志前綴、配置輸出位置等,可以通過標準logger或創(chuàng)建新的Logger對象來使用,log庫簡單易用,但功能有限,可能需要配合第三方日志庫如logrus、zap等來滿足復雜需求
    2024-09-09
  • Go使用Google?Gemini?Pro?API創(chuàng)建簡單聊天機器人

    Go使用Google?Gemini?Pro?API創(chuàng)建簡單聊天機器人

    這篇文章主要為大家介紹了Go使用Google?Gemini?Pro?API創(chuàng)建簡單聊天機器人實現(xiàn)過程詳解,本文將通過最新的gemini?go?sdk來實現(xiàn)命令行聊天機器人
    2023-12-12
  • Go利用ffmpeg進行視頻和音頻處理

    Go利用ffmpeg進行視頻和音頻處理

    ffmpeg 是一款功能強大的多媒體處理工具,支持視頻和音頻的編碼、解碼、轉(zhuǎn)碼,以及幀提取和流處理等功能,下面我們就來看看Go如何利用ffmpeg進行視頻和音頻處理吧
    2024-12-12
  • 深入理解?Go?中的字符串

    深入理解?Go?中的字符串

    這篇文章主要介紹了深入理解?Go?中的字符串,在編程語言中,字符串發(fā)揮著重要的角色。字符串背后的數(shù)據(jù)結(jié)構(gòu)一般有兩種類型,一種在編譯時指定長度不能修改,一種具有動態(tài)的長度可以修改,下文更多相關(guān)資料需要的小伙伴可以參考一下
    2022-05-05
  • golang防止內(nèi)存逃逸的方法小結(jié)

    golang防止內(nèi)存逃逸的方法小結(jié)

    在Go語言中,內(nèi)存逃逸是指在函數(shù)中分配的變量在函數(shù)結(jié)束后仍然被引用,防止內(nèi)存逃逸有助于提高程序的性能,因為棧上分配的內(nèi)存可以更快地被回收,本文給大家總結(jié)了一些防止內(nèi)存逃逸的方法,需要的朋友可以參考下
    2024-02-02
  • golang接口實現(xiàn)調(diào)用修改(值接收者指針接收者)場景詳解

    golang接口實現(xiàn)調(diào)用修改(值接收者指針接收者)場景詳解

    這篇文章主要為大家介紹了golang接口實現(xiàn)調(diào)用修改值接收者指針接收者示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • Go語言實現(xiàn)定時器的原理及使用詳解

    Go語言實現(xiàn)定時器的原理及使用詳解

    這篇文章主要為大家詳細介紹了Go語言實現(xiàn)定時器的兩種方法:一次性定時器(Timer)和周期性定時器(Ticker),感興趣的小伙伴可以跟隨小編一起學習一下
    2022-12-12
  • 詳解Golang如何在編譯時注入版本信息

    詳解Golang如何在編譯時注入版本信息

    這篇文章主要為大家詳細介紹了Golang如何在編譯時實現(xiàn)注入版本信息,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的可以了解一下
    2023-06-06
  • Go語言實現(xiàn)一個簡單生產(chǎn)者消費者模型

    Go語言實現(xiàn)一個簡單生產(chǎn)者消費者模型

    本文主要介紹了Go語言實現(xiàn)一個簡單生產(chǎn)者消費者模型,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12

最新評論