5個步驟搞定protoc環境安裝

小魔童哪吒發表於2021-04-02
[TOC]

胖sir:不知道你有沒有這樣的疑惑,工作中發現很多新接觸GO的小夥伴安裝protoc的環境需要折騰很久

剛開始我裝環境的時候也是花了好長時間,最後如何裝好的也不知原因,網上查詢了各種資源,也沒有一篇文章可以很好的解決這個問題.

兵長:這個好說,今天我們們就來梳理和總結一下,如何快速高效的安裝好protoc的環境

前提,先介紹一下protoc是幹啥的?

簡而言之,protoc是用於將proto檔案程式設計成各種語言原始碼檔案的工具

例如此處我們可以將proto檔案通過protoc工具,編譯生成適用於GO語言開發的原始碼檔案xxx.pb.go,一般會和GRPC進行配套使用,如果對這個感興趣,可以在後臺留言哦,此處暫且先單一說明一下protoc的環境如何一次性搞定

目前看來windows上的protoc安裝相對來說疑問還是比較多的,其實安裝還是非常簡單的,我們就來說說吧

1、下載最新版的golang安裝程式

https://github.com/protocolbuffers/protobuf/releases/

2、 解壓,把GOPATH的路徑新增到環境變數

例如:要是不知道GOPATH在哪裡獲取, 可以在終端裡面敲入go env進行檢視

3、命令列執行

go get github.com/golang/protobuf

若如上命令執行失敗,請配置代理

go env -w GO111MODULE=on  //開啟模組
go env -w GOPROXY=https://goproxy.cn,direct //啟用代理

4、%GOPATH%/src/github.com/golang/protobufxxxxx/protoc-gen-go

go build

go install

執行之後,看到自己GOPATH/bin目錄下會生成如下程式,說明環境配置成功

5、開始使用protoc

目錄結構為:

test.proto

syntax="proto3"; //版本號
package mypro;  //包名
enum ClassName{   //列舉
    class1=0;  //標號 必須從 0開始
    class2=1;
    class3=2;
}
message Student{ //訊息,對應於Go的結構體
  string name=1; //1:標號,唯一 即可(相當於資料庫中的Id,不一定要從1 ,2的順序依次排列。)
  int32 age=2;  //必須指定整型的範圍,如int32,int64
  string address=3;
  ClassName cn=4;
}
message Students{
   repeated Student person=1;  // repeated 修飾,相當於Go中切片
   string school=2;
}

執行:protoc –go_out=. *.proto , 會生成 .pb.go檔案

main.go

package main
import (
    "fmt"
    "github.com/golang/protobuf/proto"
    "mypro.com/mypro"  //引入的proto的包 , go語言中,一個目錄裡面的所有檔案都應設定成一個包
)
func main() {
    s1 := &mypro.Student{} //第一個學生資訊
    s1.Name = "jz01"
    s1.Age = 23
    s1.Address = "cq"
    s1.Cn = mypro.ClassName_class2 //列舉型別賦值

    ss := &mypro.Students{}
    ss.Person = append(ss.Person, s1) //將第一個學生資訊新增到Students對應的切片中

    s2 := &mypro.Student{}            //第二個學生資訊
    s2.Name = "jz02"
    s2.Age = 25
    s2.Address = "cd"
    s2.Cn = mypro.ClassName_class3
    ss.Person = append(ss.Person, s2) //將第二個學生資訊新增到Students對應的切片中
    ss.School = "cqu"

    fmt.Println("Students資訊為:", ss)

    // Marshal takes a protocol buffer message
    // and encodes it into the wire format, returning the data.
    buffer, _ := proto.Marshal(ss)
    fmt.Println("序列化之後的資訊為:", buffer)
    //  Use UnmarshalMerge to preserve and append to existing data.
    data := &mypro.Students{}
    proto.Unmarshal(buffer, data)
    fmt.Println("反序列化之後的資訊為:", data)
}

在main.go的同級目錄 執行 go mod init xxx , 模組化 如:go mod init mypro.com

在main.go 同級目錄 執行 go build , 若執行成功,則正確解析protobuf

當需要使用到grpc + protobuf的時候,protoc工具編譯proto檔案時,需要加上grpc外掛,具體的使用方式,感興趣的可以後臺私信小魔童哪吒哦

以上為本期全部內容,如有疑問可以在評論區或後臺提出你的疑問,我們一起交流,一起成長。

好傢伙要是文章對你還有點作用的話,請幫忙點個關注,分享到你的朋友圈,分享技術,分享快樂

技術是開放的,我們的心態,更應是開放的。擁抱變化,向陽而生,努力向前行。

作者:小魔童哪吒

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章