【问题标题】:Scan strings containing white spaces using fmt.Scan()/fmt.Scanf()/fmt.Scanln()?使用 fmt.Scan()/fmt.Scanf()/fmt.Scanln() 扫描包含空格的字符串?
【发布时间】:2021-08-12 05:34:48
【问题描述】:

使用 Go 语言,要读取带空格的输入字符串,我必须使用

s, err := bufio.NewReader(os.Stdin).ReadString('\n')

有没有办法使用fmt.Scanfmt.Scanffmt.Scanln()

【问题讨论】:

标签: go stdin


【解决方案1】:

如果您正在构建 CLI 工具,我强烈建议您查看 cobra。它是用纯 Go (see dependencies) 编写的,并被多个知名项目使用。

另外,我写了一个快速(粗略的)示例来演示如何通过从标准输入线性读取单个字节来使用Reader 接口获得更好的控制。

func byteByByte() [][]byte {
    reader := bufio.NewReader(os.Stdin)
    buffer, result := []byte{}, [][]byte{}
    for {
        c, err := reader.ReadByte()
        if err != nil {
            break
        }
        if c == byte(32) {
            result, buffer = append(result, buffer), []byte{}
            continue
        }
        buffer = append(buffer, c)
    }
    return result
}

在这里,我们暂时缓冲结果,直到达到一个空间,此时,临时缓冲区被转储到一个更大的缓冲区中。

这是一个示例,旨在向您展示如何以更多的控制/粒度使用阅读器界面,而不是作为逐字使用的一段代码。

【讨论】:

  • 如果 stdin 从未关闭,这将挂起。如果将大量数据发送到标准输入,这将消耗内存。为什么不推荐常规的 bufio.Scanner ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 2012-11-23
相关资源
最近更新 更多