1,语法速学(1):返回商品”数组”、repeated修饰符

Repeated:是一个修饰符,返回字段可以重复任意多次(包括0次) 可以认为就是一个数组(切片)

服务端:

创建protobuf文件

syntax="proto3";
package services;
import "google/api/annotations.proto";

message  ProdRequest {
    int32 prod_id =1;   //传入的商品ID
}
message ProdResponse{
    int32 prod_stock=1;//商品库存
}

message QuerySize{
    int32 size = 1;//页尺寸
}

//返回 一堆商品库存,使用了repeated修饰符
message ProdResponseList{
    repeated ProdResponse prodres=1;
}

service ProdService {
    rpc GetProdStock (ProdRequest) returns (ProdResponse){
        option (google.api.http) = {
            get: "/v1/prod/{prod_id}"
        };

    }
    rpc GetProdStocks(QuerySize) returns (ProdResponseList){

    }
}

生成Prod.pb.go文件

cd pbfiles && protoc --go_out=plugins=grpc:../services  Prod.proto

创建ProdSerbice.go文件

package services

import (
    "context"
)

type ProdService struct {

}

func(this *ProdService) GetProdStock(ctx context.Context, request *ProdRequest) (*ProdResponse, error) {

      return &ProdResponse{ProdStock:20},nil
}

func (this *ProdService) GetProdStocks(ctx context.Context,size *QuerySize) (*ProdResponseList, error){
    var Prodres []*ProdResponse
    Prodres = make([]*ProdResponse,0,3)
    Prodres = append(Prodres,&ProdResponse{ProdStock:28,})
    Prodres = append(Prodres,&ProdResponse{ProdStock:29,})
    Prodres = append(Prodres,&ProdResponse{ProdStock:30,})
    return &ProdResponseList{
        Prodres:Prodres,
    },nil
}

server.go

package main

import (
    "google.golang.org/grpc"
    "grpcpro/services"
    "net"
)

func main()  {
    rpcServer:=grpc.NewServer()
    services.RegisterProdServiceServer(rpcServer,new(services.ProdService))

    lis,_:=net.Listen("tcp",":8081")

    rpcServer.Serve(lis)


}

启动服务

go run server.go

客户端:

拷贝服务端的生成的文件Prod.pb.go到客户端目录下

mian.go

package main

import (
    "context"
    "fmt"
    "google.golang.org/grpc"
    "gprccli/services"
    "log"
)

func main(){

    conn,err:=grpc.Dial(":8081",grpc.WithInsecure())
    if err!=nil{
        log.Fatal(err)
    }
    defer conn.Close()

    prodClient:=services.NewProdServiceClient(conn)
    ctx:=context.Background()

    //prodRes,err:=prodClient.GetProdStock(context.Background(),
    //    &services.ProdRequest{ProdId:12})
    //if err!=nil{
    //    log.Fatal(err)
    //}
    //fmt.Println(prodRes.ProdStock)

    response,err := prodClient.GetProdStocks(ctx,&services.QuerySize{Size:10})

    if err!=nil{
        log.Fatal(err)
    }
    fmt.Println(response.Prodres[2].ProdStock)
}

启动客户端client 调用服务端gprc服务

go run main.go

12-16 02:15