go解析json panic因格式非法(如bom、逗号、注释),需用jq验证;终端输入卡顿因行缓冲,建议提示回车确认;大小写比较失败应统一转小写;windows中文乱码需设控制台utf-8编码。

读取 JSON 问题集时 panic: invalid character
Go 的 json.Unmarshal 对输入格式极其敏感,常见于文件末尾多逗号、注释、BOM 头或换行符错位。别急着重写解析逻辑,先用 jq . questions.json 验证合法性;若失败,说明不是 Go 的问题,而是数据本身不合规。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 用
os.ReadFile读取后,先检查字节切片是否为空(len(data) == 0),避免传空给json.Unmarshal - 确保 JSON 文件无 UTF-8 BOM:保存为 “UTF-8 without BOM”(VS Code 右下角可切换)
- 结构体字段必须首字母大写且带
json:tag,例如:type Question struct { Text string `json:"text"` Options []string `json:"options"` Correct int `json:"correct"` }
用户输入选项时卡住不响应
Go 标准库没有原生的“读取单个字符”或“禁用回车确认”功能,fmt.Scanln 或 bufio.NewReader(os.Stdin).ReadString('\n') 都会等回车。这不是 bug,是设计使然——终端默认行缓冲。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- Linux/macOS 下可用
golang.org/x/term的term.ReadPassword(虽名 Password,但只禁回显,仍需按回车) - 真要“按 a/b/c 立即响应”,得调用系统命令切换终端为 raw 模式,例如:
exec.Command("stty", "-icanon").Run(),但跨平台维护成本高,初学者慎入 - 更务实的做法:明确提示用户“请输入选项编号(如 1 或 A),然后按回车”,统一用
fmt.Scan(&userInput),再做大小写和范围校验
评分逻辑把大小写不同的答案判为错误
题干里写的是 "A",用户输 "a",直接用 == 比较当然失败。这不是逻辑漏洞,是字符串比较的自然结果。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 存储正确答案时统一转小写(如
strings.ToLower(q.CorrectOption)),用户输入也立刻转:strings.ToLower(strings.TrimSpace(input)) - 若题目允许多选(如 "AB" 或 "a,b"),别用简单字符串匹配,改用
strings.FieldsFunc拆分 +map[string]bool去重比对 - 注意空格干扰:用户可能输
" A ",strings.TrimSpace必须前置
Windows 上运行时中文题目显示为乱码
Go 编译出的二进制本身不处理控制台编码,Windows 默认是 GBK,而 Go 字符串是 UTF-8。输出时字节流被 cmd 用 GBK 解码,自然成乱码。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 程序启动时加一句:
os.Setenv("GO111MODULE", "on")无效——这跟模块无关;真正要的是:syscall.MustLoadDLL("kernel32").MustFindProc("SetConsoleOutputCP").Call(65001)(仅 Windows) - 更轻量方案:用
golang.org/x/text/encoding/unicode包把字符串显式转为 GBK 再输出(但需引入额外依赖) - 最省事的临时解法:让用户在运行前执行
chcp 65001切换控制台为 UTF-8 模式
跨平台终端编码始终是个隐性坑,哪怕逻辑全对,输出一乱,用户第一反应就是“程序坏了”。别指望它自动适配,得在启动阶段主动干预。










