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