1.環(huán)境說(shuō)明
1.系統(tǒng):ubuntu 版本20.04
2.軟件:golang 版本1.15.6
2.所需文件
1.golang安裝包 https://golang.org/dl/go1.15.6.linux-amd64.tar.gz
2.grpc包 https://github.com/grpc/grpc-go/archive/v1.34.0.tar.gz
3.protoc 文件 https://github.com/protocolbuffers/protobuf/releases/download/v3.14.0/protoc-3.14.0-linux-x86_64.zip
4.protobuf 文件 https://github.com/golang/protobuf/archive/v1.4.3.tar.gz
3.環(huán)境部署
1.golang環(huán)境安裝
tar zxvf go1.15.6.linux-amd64.tar.gz-C/usr/local
2.設(shè)置環(huán)境變量
編輯編輯 /etc/profile 文件
nano /etc/profile
在文件末尾添加下列內(nèi)容
exportGOROOT=/usr/local/go
exportGOBIN=$GOROOT/bin
exportPATH=$PATH:$GOBIN:$GOROOT
3.環(huán)境變量生效命令
source/etc/profile
4.驗(yàn)證安裝是否成功命令
go version
輸出goang版本 即為成功
5.開啟 go mod
go env-wGO111MODULE=on
go env-wGOPROXY=https://goproxy.cn,https://goproxy.io,direct
6.下載依賴
gogetgoogle.golang.org/protobuf/cmd/protoc-gen-go \
? ? ? ? google.golang.org/grpc/cmd/protoc-gen-go-grpc
或者直接將grpc包和protobuf包解壓到$GOPATH/google.golang.org
7.把protoc添加到環(huán)境變量中
exportPATH="$PATH:$(go env GOPATH)/bin"
或者直接解壓protoc-3.14.0-linux-x86_64.zip ,將bin目錄的protoc復(fù)制到$GOBIN目錄
8.運(yùn)行helloword example
cd $GOPATH/google.golang.org/grpc/example/helloworld
$ gorun greeter_server/main.go
重新打開一個(gè)新端口作郭,運(yùn)行
$ gorun greeter_client/main.go
Greeting: Hello world
9.修改proto內(nèi)容陨囊,重新編譯
protoc--go_out=.--go_opt=paths=source_relative \
--go-grpc_out=.--go-grpc_opt=paths=source_relative \
?? helloworld/helloworld.proto
10. go_package 說(shuō)明
.proto文件應(yīng)包含一個(gè)選項(xiàng),用于指定包含所生成代碼的Go軟件包的完整導(dǎo)入路徑夹攒。
option go_package="example.com/foo/bar";
輸出文件所在的輸出目錄的子目錄取決于go_package選項(xiàng)和編譯器標(biāo)志:
默認(rèn)情況下蜘醋,輸出文件放置在以Go軟件包的導(dǎo)入路徑命名的目錄中。例如芹助,protos/foo.proto 具有上述go_package選項(xiàng)的文件將生成名為的文件 example.com/foo/bar/foo.pb.go堂湖。
如果給--go_opt=module=$PREFIX標(biāo)記protoc,則從輸出文件名中刪除指定的目錄前綴状土。例如无蜂,protos/foo.proto具有上述go_package選項(xiàng)和標(biāo)志--go_opt=module=example.com/foo的文件將生成名為的文件 bar/foo.pb.go。
如果給--go_opt=paths=source_relative標(biāo)記 protoc蒙谓,則將輸出文件放置在與輸入文件相同的相對(duì)目錄中斥季。例如,該文件protos/foo.proto 生成名為的文件protos/foo.pb.go累驮。
當(dāng)您像這樣運(yùn)行原型編譯器時(shí)
protoc--proto_path=src--go_out=build / gen--go_opt=paths=source_relative src / foo.proto src / bar / baz.proto
源.proto文件應(yīng)包含一個(gè)go_package選項(xiàng)酣倾,用于為包含該文件的包指定完整的Go導(dǎo)入路徑。如果沒(méi)有 go_package選擇谤专,編譯器將嘗試猜測(cè)一個(gè)躁锡。編譯器的未來(lái)版本將使該go_package選項(xiàng)成為必需。
生成代碼的Go軟件包名稱將是該go_package選項(xiàng)的最后一個(gè)路徑部分 置侍。例如:
// Go程序包名稱為“ timestamppb”映之。
選項(xiàng)go_package=“ google.golang.org/protobuf/types/known/timestamppb”;
導(dǎo)入路徑用于確定一個(gè).proto文件導(dǎo)入另一.proto文件時(shí)必須生成哪些導(dǎo)入語(yǔ)句 拦焚。例如,如果是 a.protoimport b.proto杠输,則生成的a.pb.go文件需要導(dǎo)入包含生成的b.pb.go文件的Go軟件包(除非兩個(gè)文件都在同一個(gè)軟件包中)赎败。
導(dǎo)入路徑還用于構(gòu)造輸出文件名。有關(guān)詳細(xì)信息蠢甲,請(qǐng)參見上面的“編譯器調(diào)用”部分僵刮。
該go_package選項(xiàng)還可以包括一個(gè)顯式的程序包名稱,該名稱與導(dǎo)入路徑之間用分號(hào)分隔鹦牛。例如:“ example.com/foo;package_name”搞糕。不鼓勵(lì)使用此方法,因?yàn)橥ǔJ拱Q與導(dǎo)入路徑相對(duì)應(yīng)(默認(rèn)值)更加清晰能岩。作為該go_package選項(xiàng) 的替代方法寞宫,.proto可以在命令行中使用 --go_opt=M=$FILENAME=$IMPORT_PATH flag to protoc.
具體protoc語(yǔ)法詳情見鏈接 https://developers.google.com/protocol-buffers/docs/reference/go-generated#package