You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
}

方案优势

  1. 精准匹配面试输入格式:先读取行数N,再读取对应数量的行,避免无意义阻塞;
  2. 鲁棒的字符串分割:strings.Fields()会自动忽略行内的多个空格、制表符等空白字符,比strings.Split(" ")更适配实际输入场景;
  3. 完善的错误处理:对读取失败、格式错误等情况都做了处理,代码稳定性更高;
  4. API简洁易用:bufio.Scanner是Go标准库中专门用于行读取的工具,可读性和维护性更好。

内容的提问来源于stack exchange,提问作者Rad4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 15:50:30