Protobuf對于Golang通過插件進行支持,因些需要安裝protoc的執行環境,下面我們來一步步看下,如何搭建一個編譯環境。

創新互聯是網站建設專家,致力于互聯網品牌建設與網絡營銷,專業領域包括成都做網站、網站建設、外貿營銷網站建設、電商網站制作開發、重慶小程序開發、微信營銷、系統平臺開發,與其他網站設計及系統開發公司不同,我們的整合解決方案結合了恒基網絡品牌建設經驗和互聯網整合營銷的理念,并將策略和執行緊密結合,且不斷評估并優化我們的方案,為客戶提供全方位的互聯網品牌整合方案!
1. 安裝protoc
2. 下載并安裝protobuf-Go插件
從github上下載插件,并解壓(),得到以下的目錄
[plain] view plain copy
drwxr-xr-x 6 root root 4096 Jun 16 15:45 .
drwxr-xr-x 3 root root 4096 Jun 16 15:48 ..
-rw-r--r-- 1 root root 173 Jun 15 06:31 AUTHORS
-rw-r--r-- 1 root root 170 Jun 15 06:31 CONTRIBUTORS
drwxr-xr-x 3 root root 4096 Jun 15 06:31 jsonpb
-rw-r--r-- 1 root root 1583 Jun 15 06:31 LICENSE
-rw-r--r-- 1 root root 2080 Jun 15 06:31 Makefile
-rw-r--r-- 1 root root 1955 Jun 15 06:31 Make.protobuf
drwxr-xr-x 4 root root 4096 Jun 15 06:31 proto
drwxr-xr-x 7 root root 4096 Jun 16 15:42 protoc-gen-go
drwxr-xr-x 8 root root 4096 Jun 15 06:31 ptypes
-rw-r--r-- 1 root root 7149 Jun 15 06:31 README.md
這時,執行make install,多半是不會成功的,一般會報找不到對應的文件,原因在于go源文件中指定的目錄位置是這樣的
之前寫過了Grpc服務開發和接口測試初探【Java】,中間耽擱了一些時間,Go版本的gRPC測試開發實踐才有時間學習使用。其中也是由于自己Go語言不夠熟悉導致的。之前有段時間想暫時放棄Go語言的學習,導致了Go的生疏,原因是從Groovy到Java性能。
回歸正題,Go語言版本的gRPC實踐相對Java來說是比較簡單的,但是總體的工具鏈是比較復雜的,可能是因為Go生態目前相比Java還是比較匱乏吧。下面我先簡述一下大致的步驟:
以上步驟親自操作可能會遇到一些小問題,我本人搜到的教程什么的也是亂七八糟,踩了一些坑。我沒有整理出一個親自實踐之后的可行的教程,原因有二:
Go語言的gRPC的 proto 編寫跟Java大致一致,只有一個報名的參數不太一樣。下面是我的 Hello.proto 內容:
這里主要 go_package 網上搜到的配置方式有些不一樣,我沒有全都嘗試,大家在搜索的資料時候,盡量先看看 syntax 這個參數的值,以及文章教程寫作的時間,如果距離現在太久了,我建議直接關掉。搜索引擎有過濾功能,可以過濾掉過時的教程。
這里Go語言gRPC的一點優勢,就是在一個項目中即可實現,Java需要先弄一個SDK這樣。Go語言的gRPC的代碼可以通過生成代碼命令中的參數實現指定路徑。我是放在了和 proto 文件的同級目錄。
服務端代碼也是比較格式化的內容,如下:
其中 pb.RegisterHelloServiceServer(s, Ser{}) 如果報錯,請檢查自己安裝的工具 protoc-gen-go 或者 protoc-gen-gofast 版本,一般提取報錯 message 搜索也能得到解決辦法。
下面是客戶端的代碼,由于學藝不精,其中大部分參數的含義目前我也不是很清楚,特別是基于 stream 的請求響應的方式使用。后面我先把Java的學完,再回過頭來看Go的,按照這個順序學習和分享。
服務端輸出:
忘記打日志了。沒有輸出
客戶端輸出:
Go語言的gRPC測試開發實踐已經完事兒,大概率上我不會在工作中使用Go作為主力gRPC測試語言,后面測試實踐內容還是會以Java為主。
??因為在一些場景中指針表示的含義是比類型表示的多的
假設上述結構體表示一個用戶的信息,創建用戶后希望更新用戶名時該怎么實現?這里隱藏的一個問題就是: address 為空字符串時,到底是表示不更新該字段?還是表示將該字段置為空?
使用指針的意義就是該字段可以額外表示一重含義
protoc : libprotoc 3.17.3
protoc-gen-go : 1.5.2
optional 對于 protoc 和 protoc-gen-go 的版本都是有依賴的,在低版本中還需要帶上額外字段
[需要帶上--experimental_allow_proto3_optional]( protocol buffers - How to define an optional field in protobuf 3 - Stack Overflow )
使用上面同樣的 protoc 文件,發現是無法支持的
在 gogo/protobuf 還未支持 optional 的語法,一種可行的解法就是在 proto3 中導入 proto2 的文件,并且把需要定義為指針的字段放在 proto2 中
不過在網絡上很難找到 wktptr 的介紹,這個語法也非常讓人困惑
nullable 擴展字段無法支持原生類型,此擴展字段對此是無效的
??
這樣可以將需要定義為指針的元素定義到 proto2 中然后內嵌進來
網站欄目:protocgo語言 proto language
URL鏈接:http://www.yijiale78.com/article4/ddocpie.html
成都網站建設公司_創新互聯,為您提供面包屑導航、品牌網站建設、微信公眾號、網站導航、網站排名、定制網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯