dongyang7152 2019-07-23 08: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 08: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条)
编辑
预览

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部