
本文介绍如何在 go 中读取文本文件、按规则解析形如 "a1,c2" 的棋盘坐标,并对字母(需 ≤ 'h')和数字(需 ≤ 8)进行逐项校验,输出带行列位置的详细错误信息。
本文介绍如何在 go 中读取文本文件、按规则解析形如 "a1,c2" 的棋盘坐标,并对字母(需 ≤ 'h')和数字(需 ≤ 8)进行逐项校验,输出带行列位置的详细错误信息。
在处理类似国际象棋或自定义棋盘坐标的输入文件时,常需严格校验格式:每行包含两个以逗号分隔的坐标(如 A1,C2),每个坐标由一个大写字母(A–H)后跟一个整数(1–8)组成。超出范围即视为非法输入。下面提供一套健壮、可定位、易维护的实现方案。
核心思路
- 逐行读取:使用 bufio.Scanner 安全高效地读取文件所有行;
- 结构化解析:每行先定位逗号,再分别提取左右两组坐标;
- 字符+数字双校验:对字母部分直接比较 ASCII 值(c > 'H' || c < 'A'),对数字部分用 strconv.Atoi 转换后判断是否 > 8 或 < 1;
- 精准定位错误:输出错误字符/数字及其在文件中的行列索引(行号 i,列偏移 j),便于调试与日志追踪。
完整可运行代码
package main
import (
"bufio"
"fmt"
"log"
"os"
"strconv"
"strings"
)
func readLines(path string) ([]string, error) {
file, err := os.Open(path)
if err != nil {
return nil, err
}
defer file.Close()
var lines []string
scanner := bufio.NewScanner(file)
for scanner.Scan() {
lines = append(lines, scanner.Text())
}
return lines, scanner.Err()
}
// checkOne 校验单个坐标:字母是否在 A–H 范围内,数字是否在 1–8 范围内
func checkOne(letter byte, number, row, col int) {
if letter < 'A' || letter > 'H' {
fmt.Printf("invalid input letter %q @ (line %d, column %d)\n", letter, row, col)
}
if number < 1 || number > 8 {
fmt.Printf("invalid input number %d @ (line %d, column %d)\n", number, row, col+1)
}
}
func main() {
lines, err := readLines("chessin.txt")
if err != nil {
log.Fatalf("readLines: %s", err)
}
for i, line := range lines {
// 查找逗号分隔符
comma := strings.IndexByte(line, ',')
if comma == -1 {
log.Fatalf("missing comma at line %d: %q", i, line)
}
// 解析左侧坐标:如 "A10" → 字母 'A',数字 10
if len(line) < 2 || comma < 1 {
log.Fatalf("malformed left coordinate at line %d: %q", i, line)
}
leftLetter := line[0]
leftNumStr := line[1:comma]
leftNum, err := strconv.Atoi(leftNumStr)
if err != nil {
log.Fatalf("invalid number format in left coordinate at line %d: %q", i, leftNumStr)
}
checkOne(leftLetter, leftNum, i, 0)
// 解析右侧坐标:如 "C3" → 字母 'C',数字 3
if len(line) <= comma+1 {
log.Fatalf("malformed right coordinate at line %d: %q", i, line)
}
rightLetter := line[comma+1]
rightNumStr := line[comma+2:]
rightNum, err := strconv.Atoi(rightNumStr)
if err != nil {
log.Fatalf("invalid number format in right coordinate at line %d: %q", i, rightNumStr)
}
checkOne(rightLetter, rightNum, i, comma+1)
}
}关键注意事项
- ✅ 边界防护:增加了对 letter < 'A' 的检查,避免仅校验上限导致 '@' 或小写字母漏判;
- ✅ 输入健壮性:校验逗号存在性、子串长度、数字转换失败等异常,避免 panic;
- ✅ 列定位准确:col 参数传入的是字母起始位置(如 "A10,C3" 中 'A' 在索引 0,'C' 在索引 4),数字错误报告列号 col+1 更符合直觉;
- ⚠️ 扩展建议:若需支持多空格、忽略注释或更复杂格式(如 A10-B2),可引入正则或专用 parser;生产环境建议封装为 ValidateCoordinate(string) error 并返回结构化错误。
该方案兼顾清晰性与实用性,适用于教学、工具脚本及轻量级配置校验场景。

















