`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)
}✅ 关键说明:
⚠️ 注意:不要混用 fmt.Scan 和 bufio.Reader 读取同一输入流,否则可能因缓冲区残留导致不可预期行为。统一使用 bufio 是处理多词/整行输入的最佳实践。