如何将Golang终端输入内容改写为长尾词?
- 内容介绍
- 文章标签
- 相关推荐
本文共计888个文字,预计阅读时间需要4分钟。
由于+fmt.Scan+等函数默认从+os.Stdin+读取,但会一直等待用户按下回车键(换行符)才解析;如果只输入了一半就停止,或者输入完毕没按回车,程序就会挂在那儿——这不是bug,是设计如此。
- 它按空格/制表/换行切分输入,适合读多个单词或数字,比如
fmt.Scan(&name, &age)可一次读两个值 - 遇到换行前的空白(开头或中间连续空格)会跳过,但不会跳过换行本身
- 如果输入类型不匹配(比如要读
int却输abc),Scan返回错误且留下未消费的输入,下次调用还会卡在同样位置
想逐行读字符串,该用 bufio.Scanner 还是 bufio.ReadBytes?
bufio.Scanner 是最常用、最安全的选择,尤其读用户手动输入的行;bufio.ReadBytes('\n') 更底层,适合需要保留换行符或处理超长行的场景。
-
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+ 内置。
立即学习“go语言免费学习笔记(深入)”;
- 读密码示例:
password, err := term.ReadPassword(int(os.Stdin.Fd())),输入时无回显,回车后返回
[]byte - 注意:它只对真实终端有效,管道或重定向时会报
invalid argument,需提前用term.IsTerminal检查 - 别自己用
syscall改终端模式——跨平台难,Windows/Linux 行为差异大,x/term已覆盖主流情况
Scan 当成“按回车就拿到一行”用,结果发现它其实按空格切,还吃掉换行——这种隐含行为最容易被忽略。本文共计888个文字,预计阅读时间需要4分钟。
由于+fmt.Scan+等函数默认从+os.Stdin+读取,但会一直等待用户按下回车键(换行符)才解析;如果只输入了一半就停止,或者输入完毕没按回车,程序就会挂在那儿——这不是bug,是设计如此。
- 它按空格/制表/换行切分输入,适合读多个单词或数字,比如
fmt.Scan(&name, &age)可一次读两个值 - 遇到换行前的空白(开头或中间连续空格)会跳过,但不会跳过换行本身
- 如果输入类型不匹配(比如要读
int却输abc),Scan返回错误且留下未消费的输入,下次调用还会卡在同样位置
想逐行读字符串,该用 bufio.Scanner 还是 bufio.ReadBytes?
bufio.Scanner 是最常用、最安全的选择,尤其读用户手动输入的行;bufio.ReadBytes('\n') 更底层,适合需要保留换行符或处理超长行的场景。
-
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+ 内置。
立即学习“go语言免费学习笔记(深入)”;
- 读密码示例:
password, err := term.ReadPassword(int(os.Stdin.Fd())),输入时无回显,回车后返回
[]byte - 注意:它只对真实终端有效,管道或重定向时会报
invalid argument,需提前用term.IsTerminal检查 - 别自己用
syscall改终端模式——跨平台难,Windows/Linux 行为差异大,x/term已覆盖主流情况
Scan 当成“按回车就拿到一行”用,结果发现它其实按空格切,还吃掉换行——这种隐含行为最容易被忽略。
