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 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。