如何在 Go 中从控制台读取包含空格的多词字符串

`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 是处理多词/整行输入的最佳实践。