
本文介绍在 go 语言中高效读取两行标准输入、将每行空格分隔的数字解析为独立 int 切片的完整实现,涵盖字符串分割、安全整型转换及错误处理要点。
本文介绍在 go 语言中高效读取两行标准输入、将每行空格分隔的数字解析为独立 int 切片的完整实现,涵盖字符串分割、安全整型转换及错误处理要点。
在 Go 中,从 stdin 读取多行空格分隔整数并分别存入多个 []int,关键在于:逐行读取 → 按空白字符切分 → 逐字段转整型 → 收集到切片。下面是一个健壮、可复用的教程式实现。
核心步骤解析
-
使用
bufio.Scanner安全读行(自动处理换行与缓冲); -
用
strings.Fields()分割字符串——它按任意空白符(空格、制表符、换行等)拆分,且自动忽略前后及中间多余空白,比strings.Split(s, " ")更可靠; -
用
strconv.Atoi()转换每个字段,并忽略转换失败项(如非数字输入),实际项目中可根据需求改为报错退出或返回 error; - 限制仅读取前两行,避免无限等待或意外多行输入干扰逻辑。
完整可运行代码
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
// numbers 将一行字符串解析为 int 切片,跳过无法转换的字段
func numbers(s string) []int {
var result []int
for _, field := range strings.Fields(s) {
if i, err := strconv.Atoi(field); err == nil {
result = append(result, i)
}
// 注意:此处静默跳过非法字段;生产环境建议记录警告或返回 error
}
return result
}
func main() {
var firstLine, secondLine []int
scanner := bufio.NewScanner(os.Stdin)
// 显式控制只读两行,避免 Scanner 循环过度
for i := 1; i <= 2 && scanner.Scan(); i++ {
line := scanner.Text()
switch i {
case 1:
firstLine = numbers(line)
case 2:
secondLine = numbers(line)
}
}
// 输出结果(便于验证)
fmt.Println(firstLine) // e.g., [1 2 3]
fmt.Println(secondLine) // e.g., [4 5 6]
}注意事项与最佳实践
- ✅ 不要用
strings.Split(s, " "):当输入含连续空格(如"1 2 3")或首尾空格时,会产生空字符串,导致Atoi("")报错;strings.Fields()是更健壮的选择。 - ⚠️ 错误处理策略需按场景选择:示例中忽略转换失败项,适合竞赛或简单脚本;若输入格式严格,应在
err != nil时fmt.Fprintln(os.Stderr, "invalid number:", field)并os.Exit(1)。 - ? 避免无限循环:未加行数限制的
for scanner.Scan()在仅输入一行时会阻塞等待第二行。显式计数(如i )是安全做法。 - ? 扩展性提示:若需支持任意行数,可将
firstLine/secondLine替换为[][]int,并在循环中lines = append(lines, numbers(line))。
通过以上结构化实现,你不仅能准确完成双行整数切片解析,还掌握了 Go 中 I/O、字符串处理与类型转换的核心模式。

















