本文介绍在算法竞赛等场景中,如何优雅、健壮地从标准输入读取指定数量的整数(或浮点数、字符串),避免手动循环控制和忽略错误的常见陷阱,并提供可复用的结构化实现。
在算法编程题中,输入格式常为「首行给出数据个数 n,随后 n 行各含一个值」(如整数、浮点数或字符串)。此时,简单使用 for { if count == 0 { break } ... } 结构虽能工作,但逻辑松散、错误处理缺失、变量作用域不合理,易引发运行时 panic 或静默失败。
更推荐的做法是将循环条件、输入读取与错误检查统一整合,同时确保每个临时变量(如单次读入的 input)作用域最小化,并显式处理 fmt.Scanf 的返回错误。以下为优化后的 Go 实现:
package main
import "fmt"
func main() {
var nums []int
var count int
var err error
// 读取总数,支持换行符(%d\n 更鲁棒)
for _, err = fmt.Scanf("%d\n", &count); err == nil && count > 0; count-- {
var input int
_, err = fmt.Scanf("%d\n", &input)
nums = append(nums, input)
}
if err != nil {
panic(fmt.Sprintf("input error: %v", err))
}
// 示例:输出验证
fmt.Println("Read integers:", nums)
}✅ 关键改进点说明:
判断,避免 break 扰乱流程; ? 扩展提示(适配其他类型):
⚠️ 注意事项:
掌握这种结构清晰、错误透明的输入模式,是写出稳定、可维护算法代码的重要基础。