Go语言面试:如何获取指定格式多行输入的最优方案?
Go面试场景下固定格式标准输入的最优读取方案
输入格式示例
3 hello elloh test estt tier riet
第一行是整数N,表示后续有N行数据,每行包含两个字符串。
现有方法的问题分析
- 方法1:依赖空行作为停止条件,不符合面试输入的固定格式要求。如果输入没有空行,程序会一直阻塞等待输入;同时没有利用第一行的行数计数,可能出现读取行数与实际要求不符的情况。
- 方法2:
ioutil.ReadAll在Go 1.16版本后已被弃用,推荐使用io.ReadAll;终端手动输入时,需通过Ctrl+D(Linux/macOS)或Ctrl+Z(Windows)触发EOF来结束输入,虽可行但不够直观;此外该方法未处理输入行数与第一行计数不匹配的情况,且strings.Split("\n")可能产生空字符串元素,导致数据解析错误。
最优实现方案
推荐使用bufio.Scanner,它专门适配逐行读取场景,结合第一行的行数计数可以精确控制读取逻辑,代码健壮性更高:
package main import ( "bufio" "fmt" "os" "strconv" "strings" ) func main() { scanner := bufio.NewScanner(os.Stdin) // 读取第一行的行数N if !scanner.Scan() { fmt.Println("读取行数失败") return } nStr := strings.TrimSpace(scanner.Text()) n, err := strconv.Atoi(nStr) if err != nil { fmt.Println("行数格式错误") return } var lines []string // 读取后续N行数据 for i := 0; i < n; i++ { if !scanner.Scan() { fmt.Printf("读取第%d行失败\n", i+1) return } line := strings.TrimSpace(scanner.Text()) // 分割字符串,自动忽略多余空格 parts := strings.Fields(line) if len(parts) != 2 { fmt.Printf("第%d行格式错误\n", i+1) return } lines = append(lines, parts...) } // 处理扫描过程中的错误 if err := scanner.Err(); err != nil { fmt.Println("读取输入出错:", err) return } fmt.Println(lines) }
方案优势
- 精准匹配面试输入格式:先读取行数N,再读取对应数量的行,避免无意义阻塞;
- 鲁棒的字符串分割:
strings.Fields()会自动忽略行内的多个空格、制表符等空白字符,比strings.Split(" ")更适配实际输入场景; - 完善的错误处理:对读取失败、格式错误等情况都做了处理,代码稳定性更高;
- API简洁易用:
bufio.Scanner是Go标准库中专门用于行读取的工具,可读性和维护性更好。
内容的提问来源于stack exchange,提问作者Rad4
相关产品推荐
相关产品推荐

