Skip to main content

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

通过这种方式,我们可以创建包含更多上下文信息的错误类型,从而更好地处理和调试错误。