使用Go语言,要读取带有空格的输入字符串,我必须使用
s, err := bufio.NewReader(os.Stdin).ReadString('n')
是否有办法使用fmt.Scan
,fmt.Scanf
或fmt.Scanln()
?
如果您正在构建CLI工具,我强烈建议您查看cobra。它是用纯go语言编写的(参见依赖项),并被多个知名项目使用。
或者,我写了一个快速的(粗略的)示例来演示如何通过从stdin中线性读取单个字节来获得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
}
在这里,我们临时缓冲结果,直到到达一个空间,此时,临时缓冲区被转储到一个更大的缓冲区。
这意味着作为一个示例,向您展示如何使用更多的控制/粒度阅读器界面,而不是作为一段代码逐字使用。