gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go語言的例子(下)
第一篇文章(大約半年前寫的):https://www.cnblogs.com/cgzl/p/11246324.html
gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go語言的例子(上)
接著上一篇文章。
寫入到JSON
首先寫一個func:
在這裡,使用了jsonpb裡面的Marshaler這個struct,這個struct上有一個方法叫做MarshalToString,它可以把proto.Message型別轉化為JSON字串。
與此同時,需要新增引用 ,通常IDE會自動新增該引用。
然後修改main方法,新增兩行程式碼:
執行 go run main.go:
列印到螢幕上到pmStr為:
下面檢視一下jsonpb.Marshaler 的原始碼:
可以看到裡面有幾個屬性,它們可以用來配置JSON轉化。
我可以設定縮緊為一個tab:
然後再次執行go程式,結果如下:
而json裡的這些屬性名是怎麼轉化的呢?開啟proto生成的go檔案:
可以看到前4個屬性的tags除了有protobuf的,後邊還有json的,所以生成json的屬性名等資訊就來自這些tags。
從JSON讀取
這裡就是使用jsonpb.UnmarshalString這個方法,其餘的都很簡單就不解釋了。
執行結果如下:
列舉的例子
在src下面建立second資料夾,裡面建立enum.proto檔案,
程式碼如下:
執行:protoc --proto_path=src/ --go_out=src/ src/second/enum.proto
生成的程式碼如下:
go裡面沒有列舉型別,所以生成的是const常量。
同時還生成了兩個map:
一個是數值作為key,文字作為value,另一個map正好反過來。
再看一下這個訊息本身的struct:
然後建立一個函式,並在main裡面呼叫:
函式返回的是指標,然後在main函式裡使用了Gender_name這個map,通過em.Gender的數值獲取到對應到文字並輸出。
執行結果如下:
複雜型別
在src下面建立third資料夾,並建立complex.proto檔案:
可以看到DepartmentMessage裡面到employees屬性是EmployeeMessage的一個集合。
而且DepartmentMessage有一個parent_department屬性,它的型別為本身。
執行:protoc --proto_path=src/ --go_out=src/ src/third/complex.proto
可以看到這生成的檔案裡面有倆個struct:
然後建立函式,並在main裡面呼叫:
注意這裡面的指標。
輸出結果是:
Go的例子就到這