MST

星途 面试题库

面试题:Go自定义error类型的格式化处理

在Go中,自定义一个带有额外信息的error类型,例如一个表示文件读取失败的error,除了基本的错误信息外,还需要包含文件名。并且这个自定义error类型要支持fmt.Printf等格式化输出函数的不同格式化方式(如 %v、%s、%#v),请实现相关代码。
12.4万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
)

// FileReadError 自定义文件读取失败的错误类型
type FileReadError struct {
    ErrMsg  string
    FileName string
}

// Error 返回基本错误信息,满足error接口
func (f FileReadError) Error() string {
    return f.ErrMsg
}

// Format 实现fmt.Formatter接口,支持不同格式化方式
func (f FileReadError) Format(s fmt.State, verb rune) {
    switch verb {
    case 'v':
        if s.Flag('+') {
            fmt.Fprintf(s, "FileReadError{ErrMsg: %s, FileName: %s}", f.ErrMsg, f.FileName)
        } else {
            fmt.Fprintf(s, f.ErrMsg)
        }
    case's':
        fmt.Fprintf(s, f.ErrMsg)
    case '#v':
        fmt.Fprintf(s, "main.FileReadError{ErrMsg: %q, FileName: %q}", f.ErrMsg, f.FileName)
    }
}

func main() {
    err := FileReadError{
        ErrMsg:  "文件读取失败",
        FileName: "test.txt",
    }
    fmt.Printf("%v\n", err)
    fmt.Printf("%+v\n", err)
    fmt.Printf("%s\n", err)
    fmt.Printf("%#v\n", err)
}