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 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line