MST

星途 面试题库

面试题:Go函数重构中的错误处理与接口抽象

有一个处理文件读取并解析数据的Go函数如下: ```go func ReadAndParseFile(filePath string) ([]map[string]string, error) { data, err := ioutil.ReadFile(filePath) if err != nil { return nil, err } lines := strings.Split(string(data), "\n") result := make([]map[string]string, 0) for _, line := range lines { parts := strings.Split(line, ":") if len(parts) != 2 { return nil, fmt.Errorf("invalid line format: %s", line) } subMap := make(map[string]string) subMap[parts[0]] = parts[1] result = append(result, subMap) } return result, nil } ``` 请对该函数进行重构,将文件读取和解析部分进行接口抽象,同时优化错误处理,使得代码在不同的文件读取场景(如从网络读取类似数据)下也能复用,并且在发生错误时能提供更详细的错误信息。
39.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 首先定义文件读取和解析的接口:
// FileReader 定义文件读取接口
type FileReader interface {
    Read(filePath string) ([]byte, error)
}

// Parser 定义数据解析接口
type Parser interface {
    Parse(data []byte) ([]map[string]string, error)
}
  1. 实现默认的文件读取器:
// DefaultFileReader 默认的文件读取器实现
type DefaultFileReader struct{}

func (dfr *DefaultFileReader) Read(filePath string) ([]byte, error) {
    return ioutil.ReadFile(filePath)
}
  1. 实现默认的解析器:
// DefaultParser 默认的数据解析器实现
type DefaultParser struct{}

func (dp *DefaultParser) Parse(data []byte) ([]map[string]string, error) {
    lines := strings.Split(string(data), "\n")
    result := make([]map[string]string, 0)
    for _, line := range lines {
        parts := strings.Split(line, ":")
        if len(parts) != 2 {
            return nil, fmt.Errorf("invalid line format: %s", line)
        }
        subMap := make(map[string]string)
        subMap[parts[0]] = parts[1]
        result = append(result, subMap)
    }
    return result, nil
}
  1. 重构 ReadAndParseFile 函数:
func ReadAndParseFile(reader FileReader, parser Parser, filePath string) ([]map[string]string, error) {
    data, err := reader.Read(filePath)
    if err != nil {
        return nil, fmt.Errorf("file read error: %w", err)
    }
    result, err := parser.Parse(data)
    if err != nil {
        return nil, fmt.Errorf("data parse error: %w", err)
    }
    return result, nil
}
  1. 使用示例:
func main() {
    defaultReader := &DefaultFileReader{}
    defaultParser := &DefaultParser{}
    result, err := ReadAndParseFile(defaultReader, defaultParser, "test.txt")
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    fmt.Println("Result:", result)
}

这样重构后,ReadAndParseFile 函数通过接口抽象,可在不同的文件读取场景(如从网络读取类似数据,只需实现 FileReader 接口)下复用,同时优化了错误处理,提供了更详细的错误信息。