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

如何避免对具有不同功能的相同模式进行 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贡献1803条经验 获得超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
  • 1 回答
  • 0 关注
  • 97 浏览
慕课专栏
更多

添加回答

举报

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