Go 没有泛型,业务逻辑相似的 grpc 调用代码如何能更优雅一些?
有个 gate 网关,包装一层 grpc 调用 logic 上的接口,协议使用的 protobuf 。大致业务流程都差不多: 1.反序列化成对象 2.调用 grpc 接口 3.根据结果,发送到客户端。
具体代码如下:
// 创建群 func (tcp *TcpConn) onHandleCreateGroup(header *cim.ImHeader, buff []byte) { req := &cim.CIMGroupCreateReq{} err := proto.Unmarshal(buff, req) if err != nil { logger.Sugar.Warnf("onHandleCreateGroup error") return } logger.Sugar.Info("onHandleCreateGroup") conn := GetMessageConn() ctx, cancelFun := context.WithTimeout(context.Background(), time.Second*3) defer cancelFun() rsp, err := conn.CreateGroup(ctx, req) if err != nil { logger.Sugar.Warnf("CreateGroup(gRPC) err:", err.Error()) } else { _, err = tcp.Send(header.SeqNum, uint16(GROUP_CREATE_DEFAULT_REQ), rsp) logger.Sugar.Infof("onHandleCreateGroup CreateGroup(gRPC) res") } } // 解散群 func (tcp *TcpConn) onHandleDisbandingGroup(header *cim.ImHeader, buff []byte) { req := &cim.CIMGroupDisbandingReq{} err := proto.Unmarshal(buff, req) if err != nil { logger.Sugar.Warnf("onHandleDisbandingGroup error") return } logger.Sugar.Info("onHandleDisbandingGroup") conn := GetMessageConn() ctx, cancelFun := context.WithTimeout(context.Background(), time.Second*3) defer cancelFun() rsp, err := conn.DisbandingGroup(ctx, req) if err != nil { logger.Sugar.Warnf("DisbandingGroup(gRPC) err:") } else { _, err = tcp.Send(header.SeqNum, uint16(GROUP_DISBINGDING_RSP), rsp) logger.Sugar.Infof("onHandleDisbandingGroup res") } }