面试题答案
一键面试- 首先定义文件读取和解析的接口:
// FileReader 定义文件读取接口
type FileReader interface {
Read(filePath string) ([]byte, error)
}
// Parser 定义数据解析接口
type Parser interface {
Parse(data []byte) ([]map[string]string, error)
}
- 实现默认的文件读取器:
// DefaultFileReader 默认的文件读取器实现
type DefaultFileReader struct{}
func (dfr *DefaultFileReader) Read(filePath string) ([]byte, error) {
return ioutil.ReadFile(filePath)
}
- 实现默认的解析器:
// 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
}
- 重构
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
}
- 使用示例:
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
接口)下复用,同时优化了错误处理,提供了更详细的错误信息。