Go struct method 实现 error
在 Go 语言中,自定义错误是通过实现 error 接口来完成的。error 接口只包含一个方法:
type error interface {
Error() string
}
通过定义一个结构体并为其实现 Error 方法,我们可以创建自定义错误类型。这种方式允许我们在错误中包含更多的上下文信息。
自定义错误的示例
以下是一个示例,展示了如何定义一个自定义错误类型:
package main
import (
"fmt"
)
// 定义一个自定义错误类型
type MyError struct {
Code int
Message string
}
// 实现 error 接口的 Error 方法
func (e *MyError) Error() string {
return fmt.Sprintf("Error %d: %s", e.Code, e.Message)
}
func doSomething(flag bool) error {
if !flag {
// 返回自定义错误
return &MyError{
Code: 123,
Message: "Something went wrong",
}
}
return nil
}
func main() {
err := doSomething(false)
if err != nil {
// 类型断言,获取自定义错误类型的详细信息
if myErr, ok := err.(*MyError); ok {
fmt.Printf("Custom error occurred: Code=%d, Message=%s\n", myErr.Code, myErr.Message)
} else {
fmt.Println(err)
}
}
}
解释
1. 定义结构体:
type MyError struct {
Code int
Message string
}
2. 实现 error 接口:
func (e *MyError) Error() string {
return fmt.Sprintf("Error %d: %s", e.Code, e.Message)
}
3. 使用自定义错误:
在 doSomething 函数中,根据条件返回自定义错误:
func doSomething(flag bool) error {
if !flag {
return &MyError{
Code: 123,
Message: "Something went wrong",
}
}
return nil
}
4. 处理错误:
在 main 函数中,使用类型断言来检查和处理自定义错误:
if myErr, ok := err.(*MyError); ok {
fmt.Printf("Custom error occurred: Code=%d, Message=%s\n", myErr.Code, myErr.Message)
} else {
fmt.Println(err)
}
通过这种方式,我们可以创建包含更多上下文信息的错误类型,从而更好地处理和调试错误。