
本文介绍使用 Go 语言高效读取每行含单个整数的文本文件,将其转换为 int 类型并进行数值校验(如本文介绍使用 go 语言高效读取每行含单个整数的文本文件,将其转换为 int 类型并进行数值校验(如 `
在 Go 中读取纯数字文本文件(每行一个整数)是一项常见需求,例如用于状态记录、配置索引或轮询控制。你提供的代码逻辑基本正确,但存在几个关键改进点:fmt.Fscanln 对换行符敏感且易因空行/末尾空白失败;未统一处理 io.EOF;缺少资源释放;也未体现“取切片”和条件判断的实际应用。
以下是推荐的完整实现方案:
package main import ( "fmt" "os" "strconv" "strings" ) func main() { f, err := os.Open("file") if err != nil { fmt.Printf("无法打开文件: %v\n", err) return } defer f.Close() // 确保文件关闭 var numbers []int scanner := bufio.NewScanner(f) for scanner.Scan() { line := strings.TrimSpace(scanner.Text()) if line == "" { continue // 跳过空行 } num, err := strconv.Atoi(line) if err != nil { fmt.Printf("跳过无效行 '%s': %v\n", line, err) continue } numbers = append(numbers, num) } if err := scanner.Err(); err != nil { fmt.Printf("读取文件时出错: %v\n", err) return } // ✅ 示例:对所有读取的数值做条件判断(如 < 6) for i, v := range numbers { if v < 6 { fmt.Printf("第 %d 个值 %d 符合条件(< 6),执行对应操作...\n", i+1, v) // 此处插入你的业务逻辑,如更新配方组、标记已用等 } else { fmt.Printf("第 %d 个值 %d 超出范围,跳过\n", i+1, v) } } // ✅ “取切片”示例:获取前 5 个有效数值(满足条件的子集) validSlice := make([]int, 0) for _, v := range numbers { if v >= 1 && v <= 5 { validSlice = append(validSlice, v) } } fmt.Printf("筛选出的有效配方编号(1-5): %v\n", validSlice) }⚠️ 关键注意事项:
- 避免 fmt.Fscanln:它要求严格匹配换行,遇到 \r\n(Windows)或末尾空格即失败;改用 bufio.Scanner 更健壮、高效且可控。
- 始终 defer f.Close():防止文件句柄泄漏。
- 显式处理 scanner.Err():Scan() 不会返回 io.EOF 错误,需单独检查扫描过程是否异常终止。
- 空行与格式容错:使用 strings.TrimSpace() 消除首尾空白,提升鲁棒性。
- 数值校验建议分层:先 Atoi 转换,再业务逻辑判断(如 v
该方案不仅解决了“读取→转整→判断”的核心流程,还自然支持后续切片操作(如提取满足条件的子集),完美契合你“为第二周生成全新 5 人份食谱组”的实际场景。


















