【发布时间】:2021-08-12 05:34:48
【问题描述】:
使用 Go 语言,要读取带空格的输入字符串,我必须使用
s, err := bufio.NewReader(os.Stdin).ReadString('\n')
有没有办法使用fmt.Scan、fmt.Scanf或fmt.Scanln()?
【问题讨论】:
-
这能回答你的问题吗? fmt.Scanln expected newline error
使用 Go 语言,要读取带空格的输入字符串,我必须使用
s, err := bufio.NewReader(os.Stdin).ReadString('\n')
有没有办法使用fmt.Scan、fmt.Scanf或fmt.Scanln()?
【问题讨论】:
如果您正在构建 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
}
在这里,我们暂时缓冲结果,直到达到一个空间,此时,临时缓冲区被转储到一个更大的缓冲区中。
这是一个示例,旨在向您展示如何以更多的控制/粒度使用阅读器界面,而不是作为逐字使用的一段代码。
【讨论】: