最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前提

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

protoc

protoc-gen-go

protoc-gen-grpc-gateway

protoc-gen-swagger

怎么裝再開(kāi)一篇

分為三個(gè)部分:

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

首先準(zhǔn)備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ù)引入相關(guān)的依賴,例如這里的google/api/annotations.proto

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

第一個(gè)-I

引入當(dāng)前目錄(因?yàn)橐?code>hello.proto);

第二個(gè)-I

引入go的相關(guān)依賴;

第三個(gè)-I

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

完整命令:

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ù),這里設(shè)置為當(dāng)前目錄,更新下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:.

運(yùn)行:

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

這時(shí)候命令行會(huì)輸出一大串東西,生成文件失敗,并且在最后標(biāo)注了:

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

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

這時(shí)候完整的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;
}

重新運(yùn)行上面的命令,成功生成 hello.pb.gw.go文件,此時(shí)目錄如下:

.
├── 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:.

運(yùn)行:

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

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

總結(jié)

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

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

其中踩了好幾個(gè)坑:

  • google/api/annotations.proto怎么解決
  • proto引入外部proto文件怎么處理
  • gateway生成失敗報(bào)錯(cuò)

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

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

相關(guān)文章

  • go mod包拉不下來(lái)的問(wèn)題及解決方案

    go mod包拉不下來(lái)的問(wèn)題及解決方案

    這篇文章主要介紹了go mod包拉不下來(lái)的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 簡(jiǎn)化Go開(kāi)發(fā)提高生產(chǎn)力的強(qiáng)大工具及使用詳解

    簡(jiǎn)化Go開(kāi)發(fā)提高生產(chǎn)力的強(qiáng)大工具及使用詳解

    作為?Go?開(kāi)發(fā)人員,應(yīng)該都知道維持簡(jiǎn)潔高效開(kāi)發(fā)工作流程的重要性,為了提高工作效率和代碼質(zhì)量,簡(jiǎn)化開(kāi)發(fā)流程并自動(dòng)執(zhí)行重復(fù)性任務(wù)至關(guān)重要,在本文中,我們將探討一些強(qiáng)大的工具和技術(shù),它們將簡(jiǎn)化?Go?開(kāi)發(fā)過(guò)程,助力您的編碼之旅
    2023-10-10
  • go開(kāi)發(fā)alertmanger實(shí)現(xiàn)釘釘報(bào)警

    go開(kāi)發(fā)alertmanger實(shí)現(xiàn)釘釘報(bào)警

    本文主要介紹了go開(kāi)發(fā)alertmanger實(shí)現(xiàn)釘釘報(bào)警,通過(guò)自己的url實(shí)現(xiàn)alertmanager的釘釘報(bào)警,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Mac GoLand打不開(kāi)(閃退)也不報(bào)錯(cuò)的解決方案

    Mac GoLand打不開(kāi)(閃退)也不報(bào)錯(cuò)的解決方案

    這篇文章主要介紹了Mac GoLand打不開(kāi)(閃退)也不報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • 使用Go語(yǔ)言實(shí)現(xiàn)向文件寫入內(nèi)容的示例代碼

    使用Go語(yǔ)言實(shí)現(xiàn)向文件寫入內(nèi)容的示例代碼

    向文件寫入內(nèi)容 的完整內(nèi)容,這是文件操作的另一個(gè)核心技能,與讀取配套,適用于日志記錄、生成報(bào)告、寫配置等場(chǎng)景,本文通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2025-07-07
  • Golang健康檢查接口的實(shí)現(xiàn)

    Golang健康檢查接口的實(shí)現(xiàn)

    本文主要介紹了Golang健康檢查接口的實(shí)現(xiàn),包括存活探針和就緒探針的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2026-04-04
  • go-zero服務(wù)部署配置及源碼解讀

    go-zero服務(wù)部署配置及源碼解讀

    這篇文章主要為大家介紹了go-zero服務(wù)部署配置及源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • golang結(jié)構(gòu)化日志slog的用法簡(jiǎn)介

    golang結(jié)構(gòu)化日志slog的用法簡(jiǎn)介

    日志是任何軟件的重要組成部分,Go?提供了一個(gè)內(nèi)置日志包(slog),在本文中,小編將簡(jiǎn)單介紹一下slog包的功能以及如何在?Go?應(yīng)用程序中使用它,感興趣的可以了解下
    2023-09-09
  • Go語(yǔ)言實(shí)現(xiàn)關(guān)閉http請(qǐng)求的方式總結(jié)

    Go語(yǔ)言實(shí)現(xiàn)關(guān)閉http請(qǐng)求的方式總結(jié)

    面試的時(shí)候問(wèn)到如何關(guān)閉http請(qǐng)求,一般人脫口而出的是關(guān)閉response.body,這是錯(cuò)誤的。本文為大家整理了三個(gè)正確關(guān)閉http請(qǐng)求的方法,希望對(duì)大家有所幫助
    2023-02-02
  • Go無(wú)緩沖通道(同步通道)的實(shí)現(xiàn)

    Go無(wú)緩沖通道(同步通道)的實(shí)現(xiàn)

    本文主要介紹了Go無(wú)緩沖通道(同步通道)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02

最新評(píng)論

鄂托克前旗| 梅州市| 朝阳市| 屯留县| 习水县| 子长县| 牙克石市| 原阳县| 贵德县| 大城县| 屯门区| 峨眉山市| 宁河县| 台北县| 正定县| 会理县| 鸡泽县| 沙田区| 北流市| 保靖县| 安图县| 灵武市| 自治县| 汕尾市| 河津市| 兰州市| 盐源县| 垣曲县| 洪湖市| 皋兰县| 肥西县| 怀来县| 松溪县| 景宁| 龙海市| 高碑店市| 潢川县| 稻城县| 南召县| 博罗县| 九寨沟县|