GoLang - grpc enum 定義預設類型
在設計 grpc 時,如果我們產品需要分區,不同區域會有不同的產品,該如何處理?
本篇預設讀者對於 grpc 有一定的瞭解,以下將簡單舉例,先說明查單一商品,以及修改為回傳多商品,最後則是 server 與 client 端如何處理這部分的流程:
建立 enum proto
首先,在 proto 設計一個取得產品的 proto 如下:
//enum 枚舉類型
enum ProductArea{
A=0;
B=1;
C=2;
}
//enum 枚舉類型範例
message ProdEnumRequest {
int32 prod_id = 1;//product ID
ProductArea prod_area=2;
}
//product
service ProdService {
//get product, enum 枚舉類型範例
rpc GetProdStockByArea (ProdEnumRequest) returns (ProdResponse);
}
接著,執行編譯 proto
在輸出的 pb.go 可以看到返回的 ProductListResponse 裡面的 ProdResponse 是一個 slice我們在 pb.go 同層新增 ProdServices.go ,在新增 product list 時,先手動預設返回一些商品列表:
type ProdService struct {
}
//get product enum 枚舉範例
func(s *ProdService) GetProdStockByArea(ctx context.Context, in *ProdEnumRequest) (*ProdResponse, error){
var stock int32 = 0;
switch in.ProdArea {
case ProductArea_A:
stock = 1
case ProductArea_B :
stock = 2
case ProductArea_C:
stock = 3
default:
stock = 4
}
return &ProdResponse{ProdStock: stock}, nil
}
Client 端接收多筆產品數據
在 grpc client 接收多筆產品數據,
//prodClient.GetProdStockByArea 枚舉類型範例
prodEnumRes, err := prodClient.GetProdStockByArea(context.Background(),
&services.ProdEnumRequest{ProdId:12, ProdArea: services.ProductArea_A})
if err != nil{
log.Fatal(err)
}
fmt.Println(prodEnumRes.ProdStock)
運行後,得到以下輸出就表示成功
1