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/