MST
星途 面试题库

面试题:Go自定义error类型的接口扩展与应用

在Go语言项目中,假设已经存在一个基础的error接口定义`type BaseError interface { Error() string }`,现在要自定义一个新的error类型,它不仅满足`BaseError`接口,还需要实现一个新的方法`ErrorCode() int`用于返回特定的错误码。在一个复杂的业务逻辑函数中,需要根据不同的错误码进行不同的处理。请详细说明设计思路并给出关键代码示例。
27.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 定义新的错误类型:创建一个结构体类型来表示自定义错误,该结构体需要实现 BaseError 接口的 Error 方法以及新的 ErrorCode 方法。
  2. 在业务逻辑函数中使用:在复杂业务逻辑函数中,返回自定义错误。当捕获到错误时,先断言错误类型是否为自定义错误类型,如果是,则根据其 ErrorCode 返回值进行不同处理。

关键代码示例

package main

import (
    "fmt"
)

// 定义基础错误接口
type BaseError interface {
    Error() string
}

// 定义自定义错误结构体
type CustomError struct {
    errorMsg string
    errorCode int
}

// 实现BaseError接口的Error方法
func (ce CustomError) Error() string {
    return ce.errorMsg
}

// 实现新的ErrorCode方法
func (ce CustomError) ErrorCode() int {
    return ce.errorCode
}

// 复杂业务逻辑函数
func complexBusinessLogic() error {
    // 模拟一些业务逻辑,这里简单返回一个自定义错误
    return CustomError{
        errorMsg:  "这是一个自定义错误",
        errorCode: 1001,
    }
}

func main() {
    err := complexBusinessLogic()
    if err != nil {
        if customErr, ok := err.(CustomError); ok {
            switch customErr.ErrorCode() {
            case 1001:
                fmt.Println("处理错误码1001的逻辑")
            case 1002:
                fmt.Println("处理错误码1002的逻辑")
            default:
                fmt.Println("处理其他错误码的逻辑")
            }
        } else {
            fmt.Println("不是自定义错误类型")
        }
    }
}