go - 如何编写一个golang验证函数,让客户端能够优雅地处理?

标签 go

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 !!")
  }

  //...


}

我有一些像上面这样的现有代码已经在使用中,所以我无法更改函数签名。

我正在编写一个必须限制某些类型错误的调用函数。 所有现有的错误都是使用 errors.New("some string") 或 fmt.Errorf("some string") 创建的。 我能做的是

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

但这并不理想。如果在服务器端,消息发生变化,客户端中断。

我考虑过将服务器端的所有错误命名为:

const ErrorType1 =  "Error 1 !!"

但很难为每个错误命名。

有更好的解决方案吗?

最佳答案

error 是一个接口(interface),所以你可以动态检查 - using type assertions - 一些特定的类型并相应地采取行动。

这是一个可能有用的代码片段 ( 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"})
}

checkErr 中的第一行是此处的票证 - 它检查 e 是否属于某种特殊的底层类型。

关于go - 如何编写一个golang验证函数,让客户端能够优雅地处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57168416/

相关文章:

Goroutines 破坏了程序

go - 使用 glide 添加 golang cobra 包时出错

go - 如何将 AWS 凭证传递给我的应用程序(Golang SDK)?

templates - Golang 带有嵌套模板的意外 EOF

exception-handling - Google Go 语言中的异常处理

go - 如何使用 http.HandleFunc 映射到以 "/"结尾的模式的同一函数

go - 如果通过 Golang channel 发送,结构实际上是否在 goroutine 之间复制?

go - 我可以只读取文件的 n 个字节而不创建 n 大小的缓冲区吗?

docker - 如何请求由Go运行在Cloud Run上的gRPC服务器

go - 如何将 map[string]interface{} 打印为 json?