dongyang7152 2019-07-23 16:19
浏览 37
已采纳

如何编写golang验证功能,以便客户端能够优雅地处理?

type Request struct{
  A string
  B string
  C string
  D string
  //...
}

func validator(req *Request)error{

  if req.A == "" && req.B != ""{
    return errors.New("Error 1 !!")
  }

  //...


}

I have some existing code like above which is already being used so I can not change the function signature.

I am writing a caller function which has to throttle some types of errors. All existing errors are created using either errors.New("some string") or fmt.Errorf("some string"). What I can do is

if err.Error() == "Error 1 !!" {
    return nil
  }

But this is not ideal. If on the server side, the message changes, client side breaks.

I thought about naming all the errors on the server side like:

const ErrorType1 =  "Error 1 !!"

But it's difficult to name each error.

Any better solutions?

  • 写回答

3条回答 默认 最新

  • du8791069 2019-07-23 16:25
    关注

    error is an interface, so you can dynamically check - using type assertions - some specific types and act accordingly.

    Here's a code snippet that may be useful (playground link):

    package main
    
    import (
        "errors"
        "fmt"
    )
    
    type MyError struct {
        msg string
        id  int
    }
    
    func (me MyError) Error() string {
        return me.msg
    }
    
    func checkErr(e error) {
        if me, ok := e.(MyError); ok {
            fmt.Println("found MyError", me)
        } else {
            fmt.Println("found error", e)
        }
    }
    
    func main() {
        checkErr(errors.New("something bad"))
        checkErr(MyError{msg: "MyError bad"})
    }
    

    The first line in checkErr is the ticket here - it checks if e is of some special underlying type.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。