
`fmt.scan` 只读取空格前的第一个单词,若需完整读取一行(含空格、制表符等),应使用 `bufio.newreader(os.stdin).readstring('\n')`。
在 Go 语言中,fmt.Scan(&variable) 默认以空白字符(空格、制表符、换行符)为分隔符,因此它只能捕获输入中的第一个“单词”,后续内容会被截断或遗留于输入缓冲区。例如,输入 "Hello World!" 时,sentence 仅得到 "Hello"。
要完整读取整行用户输入(包括中间空格、标点及特殊字符),推荐使用 bufio.Reader 配合 ReadString('\n'):
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
fmt.Print("请输入一句话:")
sentence, err := reader.ReadString('\n')
if err != nil {
fmt.Println("读取输入时发生错误:", err)
return
}
// ReadString 会保留末尾的 '\n',如需去除可使用 strings.TrimSpace
sentence = sentence[:len(sentence)-1] // 简单移除换行符(或改用 strings.TrimSpace)
fmt.Printf("你输入的是:%q\n", sentence)
}✅ 关键说明:
- bufio.NewReader(os.Stdin) 创建高效、带缓冲的输入读取器;
- ReadString('\n') 会持续读取直到遇到换行符(\n),并返回包含该换行符的字符串;
- 实际使用中建议检查 err(如用户意外关闭输入流),避免忽略错误;
- 若需清理首尾空白(包括 \n、\r、空格),可导入 "strings" 并调用 strings.TrimSpace(sentence),更安全可靠。
⚠️ 注意:不要混用 fmt.Scan 和 bufio.Reader 读取同一输入流,否则可能因缓冲区残留导致不可预期行为。统一使用 bufio 是处理多词/整行输入的最佳实践。










