fmt.scan卡住是因为它等待换行符才解析,且按空白符分隔、跳过开头空白但不消费换行;类型不匹配或残留输入会导致持续阻塞,读整行应优先用bufio.scanner。

Go 用 fmt.Scan 读取终端输入时为什么卡住不继续?
因为 fmt.Scan 等函数默认从 os.Stdin 读,但会一直等待用户敲回车(换行符)才解析;如果只输了一半就停了,或输完没按回车,程序就挂在那里——不是 bug,是设计如此。
- 它按空格/制表/换行切分输入,适合读多个单词或数字,比如
fmt.Scan(&name, &age)可一次读两个值 - 遇到换行前的空白(开头或中间连续空格)会跳过,但不会跳过换行本身
- 如果输入类型不匹配(比如要读
int却输abc),Scan返回错误且留下未消费的输入,下次调用还会卡在同样位置
想逐行读字符串,该用 bufio.Scanner 还是 bufio.ReadBytes?
bufio.Scanner 是最常用、最安全的选择,尤其读用户手动输入的行;bufio.ReadBytes('\n') 更底层,适合需要保留换行符或处理超长行的场景。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
-
Scanner默认单行上限 64KB,超长会报scanner.ErrTooLong,可调:sc := bufio.NewScanner(os.Stdin)<br>sc.Buffer(make([]byte, 64*1024), 1024*1024)
-
Scanner.Text()返回不含换行符的字符串;ReadBytes返回含\n的[]byte,需手动bytes.TrimSuffix - 别混用:同一
os.Stdin上不能同时用Scanner和ReadXXX,缓冲区会错乱
Windows 终端下中文输入乱码怎么办?
Go 本身不处理终端编码,乱码通常来自 cmd/powershell 的代码页和 Go 字符串解码不一致。常见于直接双击运行 .exe 或从旧版 cmd 启动。
- PowerShell 默认 UTF-8,一般没问题;cmd 默认 GBK,而 Go 字符串是 UTF-8,导致
Scanner.Text()解出来的中文是乱码字节 - 临时修复:启动前在 cmd 中执行
chcp 65001切到 UTF-8 - 长期方案:改用 Windows Terminal,或用
golang.org/x/text/encoding手动转码(不推荐,终端输入应尽量统一 UTF-8 环境)
交互式命令行(比如密码输入)怎么隐藏字符?
fmt 和 bufio 都不支持隐藏,必须调系统 API 或用第三方库;golang.org/x/term 是官方维护的轻量方案,Go 1.19+ 内置。
- 读密码示例:
password, err := term.ReadPassword(int(os.Stdin.Fd()))
,输入时无回显,回车后返回[]byte - 注意:它只对真实终端有效,管道或重定向时会报
invalid argument,需提前用term.IsTerminal检查 - 别自己用
syscall改终端模式——跨平台难,Windows/Linux 行为差异大,x/term已覆盖主流情况
Scan 当成“按回车就拿到一行”用,结果发现它其实按空格切,还吃掉换行——这种隐含行为最容易被忽略。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










