亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

如何使用proto組件編譯pb.go文件

 更新時間:2023年10月13日 11:31:45   作者:Yisany  
這篇文章主要介紹了如何使用proto組件編譯pb.go文件的詳細過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前提

所有組件已經(jīng)安裝好,包括:

protoc

protoc-gen-go

protoc-gen-grpc-gateway

protoc-gen-swagger

怎么裝再開一篇

分為三個部分:

  • 編譯pb.go
  • 編譯pb.gw.go
  • 編譯swagger.json

首先準備hello.proto文件

syntax = "proto3";
package hello;
import "google/api/annotations.proto";
service HelloWorld {
  rpc SayHelloWorld(HelloWorldRequest) returns (HelloWorldResponse) {
    option (google.api.http) = {
      post: "/hello_world"
      body: "*"
    };
  }
}
message HelloWorldRequest {
  string referer = 1;
}
message HelloWorldResponse {
  string message = 1;

1. 編譯pb.go文件

需要使用protoc-gen-go組件,命令:

protoc --go_out=plugins=grpc:. ${xxx.proto}

注意要用-I參數(shù)引入相關的依賴,例如這里的google/api/annotations.proto

protoc -I ./ -I $GOPATH/src -I $GOPATH/src/google/api --go_out=plugins=grpc:.

第一個-I

引入當前目錄(因為要用hello.proto);

第二個-I

引入go的相關依賴;

第三個-I

引入annotations.proto這個文件,使用的前提是$GOPATN/src下已經(jīng)準備好了相關的包;

完整命令:

protoc -I ./ -I $GOPATH/src -I $GOPATH/src/google/api --go_out=plugins=grpc:. ./hello.proto

輸出:

$ protoc -I ./ -I $GOPATH/src -I $GOPATH/src/google/api --go_out=plugins=grpc:. ./hello.proto
protoc-gen-go: unable to determine Go import path for "hello.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.

看輸出需要在hello.proto文件中指定go_package參數(shù),這里設置為當前目錄,更新下hello.proto內(nèi)容:

syntax = "proto3";
package hello;
option go_package="./";
import "google/api/annotations.proto";
service HelloWorld {
  rpc SayHelloWorld(HelloWorldRequest) returns (HelloWorldResponse) {
    option (google.api.http) = {
      post: "/hello_world"
      body: "*"
    };
  }
}
message HelloWorldRequest {
  string referer = 1;
}
message HelloWorldResponse {
  string message = 1;
}

再次編譯,成功生成hello.pb.go文件。

2. 編譯pb.gw.go文件

需要使用protoc-gen-grpc-gateway 組件,命令:

protoc -I ./ -I $GOPATH/src -I $GOPATH/src/google/api --grpc-gateway_out=logtostderr=true:.

運行:

protoc -I ./ -I $GOPATH/src -I $GOPATH/src/google/api --grpc-gateway_out=logtostderr=true:. ./hello.proto

這時候命令行會輸出一大串東西,生成文件失敗,并且在最后標注了:

...
--grpc-gateway_out: 11:1: expected 'IDENT', found 'import'

試了很多方法,最后發(fā)現(xiàn),go_package參數(shù)不能寫./,要加上后綴包名,例如改成./hello,不知道真正的原因是不是這個,但這樣改了以后編譯通過了。

這時候完整的hello.proto如下:

syntax = "proto3";
package hello;
option go_package="./hello";
import "google/api/annotations.proto";
service HelloWorld {
  rpc SayHelloWorld(HelloWorldRequest) returns (HelloWorldResponse) {
    option (google.api.http) = {
      post: "/hello_world"
      body: "*"
    };
  }
}
message HelloWorldRequest {
  string referer = 1;
}
message HelloWorldResponse {
  string message = 1;
}

重新運行上面的命令,成功生成 hello.pb.gw.go文件,此時目錄如下:

.
├── hello
│   └── hello.pb.gw.go
├── hello.pb.go
└── hello.proto

3. 編譯swagger.json文件

需要使用protoc-gen-swagger 組件,命令:

protoc -I ./ -I $GOPATH/src -I $GOPATH/src/google/api --swagger_out=logtostderr=true:.

運行:

protoc -I ./ -I $GOPATH/src -I $GOPATH/src/google/api --swagger_out=logtostderr=true:. ./hello.proto

變成成功,生成hello.swagger.json文件。

總結(jié)

至此,三個文件都已經(jīng)成功生成了,整理下目錄文件,如下:

.
├── hello.pb.go
├── hello.pb.gw.go
├── hello.proto
└── hello.swagger.json

其中踩了好幾個坑:

  • google/api/annotations.proto怎么解決
  • proto引入外部proto文件怎么處理
  • gateway生成失敗報錯

雖然還有些地方?jīng)]弄清楚,但好歹都解決了,記錄一下供學習。

以上就是如何使用proto組件編譯pb.go文件的詳細內(nèi)容,更多關于go proto編譯組件的資料請關注腳本之家其它相關文章!

相關文章

  • 淺析Go中序列化與反序列化的基本使用

    淺析Go中序列化與反序列化的基本使用

    序列化是指將對象轉(zhuǎn)換成字節(jié)流,從而存儲對象或?qū)ο髠鬏數(shù)絻?nèi)存、數(shù)據(jù)庫或文件的過程,反向過程稱為“反序列化”。本文主要介紹了Go中序列化與反序列化的基本使用,需要的可以參考一下
    2023-04-04
  • Go語言中的內(nèi)存布局詳解

    Go語言中的內(nèi)存布局詳解

    這篇文章主要給大家介紹了Go語言中的內(nèi)存布局,那么本文中將嘗試解釋Go如何在內(nèi)存中構(gòu)建結(jié)構(gòu)體,以及結(jié)構(gòu)體在字節(jié)和比特位方面是什么樣子。 有需要的朋友們可以參考借鑒,感興趣的朋友們下面來跟著小編一起學習學習吧。
    2016-11-11
  • Golang?統(tǒng)計字符串中數(shù)字字母數(shù)量的實現(xiàn)方法

    Golang?統(tǒng)計字符串中數(shù)字字母數(shù)量的實現(xiàn)方法

    這篇文章主要介紹了Golang?統(tǒng)計字符串中數(shù)字字母數(shù)量,本文給出了兩種從字符串獲取數(shù)字與字母數(shù)量的方法,分別是ASCII 碼值和正則表達式,需要的朋友可以參考下
    2022-06-06
  • Golang中Json的序列化和反序列化的使用

    Golang中Json的序列化和反序列化的使用

    本文主要介紹了Golang中Json的序列化和反序列化的使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Go 修改map slice array元素值操作

    Go 修改map slice array元素值操作

    這篇文章主要介紹了Go 修改map slice array元素值操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • golang RWMutex讀寫鎖實現(xiàn)讀共享寫獨占的功能示例

    golang RWMutex讀寫鎖實現(xiàn)讀共享寫獨占的功能示例

    在 Go 里除了互斥鎖外,還有讀寫鎖 RWMutex,它主要用來實現(xiàn)讀共享,寫獨占的功能,今天我們也順便分析下讀寫鎖,加深對 Go 鎖的理解
    2023-09-09
  • golang中package?is?not?in?GOROOT報錯的真正解決辦法

    golang中package?is?not?in?GOROOT報錯的真正解決辦法

    這篇文章主要給大家介紹了關于golang中package?is?not?in?GOROOT報錯的真正解決辦法,文中通過圖文介紹的非常詳細,對同樣遇到這個問題的朋友具有一定的參考學習價值,需要的朋友可以參考下
    2023-03-03
  • Gin+Gorm實現(xiàn)CRUD的實戰(zhàn)

    Gin+Gorm實現(xiàn)CRUD的實戰(zhàn)

    本文主要介紹了Gin+Gorm實現(xiàn)CRUD的實戰(zhàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • go slice 擴容實現(xiàn)原理源碼解析

    go slice 擴容實現(xiàn)原理源碼解析

    這篇文章主要為大家介紹了go slice 擴容實現(xiàn)原理源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Golang中四種gRPC模式舉例詳解

    Golang中四種gRPC模式舉例詳解

    gRPC是一種進程間通信技術,在微服務和云原生領域都有著廣泛的應用,下面這篇文章主要給大家介紹了關于Golang中四種gRPC模式的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-03-03

最新評論