MST

星途 面试题库

面试题:Go空接口在错误处理中的高级应用

在Go项目中,你需要设计一个错误处理机制,要求利用空接口来实现一种可扩展的错误类型系统,使得不同模块能够返回不同类型的错误,但主程序能够统一处理。请描述你的设计思路并给出关键代码示例。
11.2万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 定义基础错误接口:创建一个基础的错误接口,所有具体错误类型都实现这个接口。
  2. 利用空接口:在函数返回值中使用空接口 interface{} 来返回不同类型的错误。
  3. 类型断言:在主程序中通过类型断言来判断错误的具体类型,从而进行统一处理。

关键代码示例

package main

import (
    "fmt"
)

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

// 定义具体错误类型1
type SpecificError1 struct {
    Msg string
}

func (se1 SpecificError1) Error() string {
    return se1.Msg
}

// 定义具体错误类型2
type SpecificError2 struct {
    Msg string
}

func (se2 SpecificError2) Error() string {
    return se2.Msg
}

// 模拟不同模块的函数,返回空接口类型的错误
func module1() (result string, err interface{}) {
    // 这里模拟发生错误
    return "", SpecificError1{Msg: "Module 1 error"}
}

func module2() (result string, err interface{}) {
    // 这里模拟发生错误
    return "", SpecificError2{Msg: "Module 2 error"}
}

func main() {
    // 调用模块1
    _, err := module1()
    if err != nil {
        if e, ok := err.(SpecificError1); ok {
            fmt.Printf("处理SpecificError1: %v\n", e.Error())
        } else if e, ok := err.(SpecificError2); ok {
            fmt.Printf("处理SpecificError2: %v\n", e.Error())
        } else {
            fmt.Printf("未知错误: %v\n", err)
        }
    }

    // 调用模块2
    _, err = module2()
    if err != nil {
        if e, ok := err.(SpecificError1); ok {
            fmt.Printf("处理SpecificError1: %v\n", e.Error())
        } else if e, ok := err.(SpecificError2); ok {
            fmt.Printf("处理SpecificError2: %v\n", e.Error())
        } else {
            fmt.Printf("未知错误: %v\n", err)
        }
    }
}