为了账号安全,请及时绑定邮箱和手机立即绑定

如何避免对具有不同功能的相同模式进行 go lint 重复?

如何避免对具有不同功能的相同模式进行 go lint 重复?

Go
30秒到达战场 2022-11-23 20:03:25

我在重构代码时遇到困难,因为 lint 检测到模式重复但功能不同。


代码是这样的,它是为带有 protobuf 定义的 grpc 实现的


func (svc *UserService) CreateUser(ctx context.Context, req *pb.CreateUserRequest) (*pb.CreateUserResponse, error) {

    err := svc.validateCreateUser(req)

    if err != nil {

        return nil, err

    }


    user, err := svc.repo.CreateUser(ctx, req)


    if err != nil {

        return nil, err

    }


    return user, nil

}


func (svc *UserService) UpdateUser(ctx context.Context, req *pb.UpdateUserRequest) (*pb.UpdateUserResponse, error) {

    err := svc.validateUpdateUser(req)

    if err != nil {

        return nil, err

    }


    user, err := svc.repo.UpdateUser(ctx, req)


    if err != nil {

        return nil, err

    }


    return user, nil

}

提前致谢。


我不知道如何避免重复,因为函数也有不同的参数类型。


查看完整描述

1 回答

?
慕码人8056858

TA贡献1520条经验 获得超6个赞

并非所有 lint 问题都必须修复


如果您认为它会牺牲可读性,请添加 // nolint


但是……您可以使用泛型重构它们的代码



func [T, V any] someNameToBeDefined(

    ctx context.Context,

    target T,

    validator func(T) error,

    executor func(context.Context, T) (V, error),

    ) (V, error){

    if err := validator(target); err!= nil { … }

    return executor(ctx, target)

}


func (svc *UserService) CreateUser(

   ctx context.Context, 

   req *pb.CreateUserRequest,

) (*pb.CreateUserResponse, error) {

  return someNameToBeDefined(ctx,

     req,

     svc.validateCreateUser,

     svc.repo.CreateUser,

    )

}


如果您认为这是可读的,请继续。


但也许这可能不是正确的方法。


例如,您的存储库可以在创建/更新之前验证请求。


这是一种比使用泛型和函数指针恕我直言更具可读性的方法


查看完整回答
反对 回复 2022-11-23

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信