package main import ( "errors" "fmt" ) func f1(code int) (int, error) { if code == 1 { return -1, errors.New("msg test error") } return code, nil } type MsgError struct { Code int Msg string } func f2(code int) (int, error) { if code == 1 { return -1, &MsgError{code, "struct msg test error"} } return code, nil } //golang 内置error 为interface类型 /* 定义方式为 type error interface { Error() string } 可以在 内置包里面找到对应源码 GOROOT/src/builtin/builtin.go 具体怎么个情况 搞不懂。但是看了一下 对应的error package 里面的new 方法返回一个对应的 构造体 指针 并定义了一个Error 方法 猜测应该是 如果返回是error 类型 内部会 自动调用对应 数据类型的 Error 方法 等真正搞明白再来修改文章 */ func (msg *MsgError) Error() string { return fmt.Sprintf("%s", msg.Msg) } func main() { // for _, v := range []int{1, 2, 3, 4, 5, 6} { // if code, err := f1(v); err != nil { // fmt.Println(err) // } else { // fmt.Println("success:", code) // } // } for _, i := range []int{1, 2, 3} { if code, err := f2(i); err != nil { fmt.Println(exrr) } else { fmt.Println("success:", code) } } }
有疑问加站长微信联系(非本文作者)