1. 程式人生 > >gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go語言的例子(下)

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的例子就到這