从 Go 中的标准输入读取时允许超过 1024 个字符的推荐方法是什么?
例如,使用 bufio.Scanner
的这段代码的最大输入长度为 1024。
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
input := scanner.Text()
fmt.Println(input)
}
在一些建议的答案后更新...
对不起,伙计们 - 我一定还是做错了什么,或者说错了问题。我尝试了这两个建议,但仍然看到相同的问题。下面是代码的更新版本。症状是扫描仪不接受第 1024 个字符之后的输入。例如尝试运行它然后粘贴一个长度为 1025 个字符的字符串,它会在字符 1024 之后停止接受输入。
package main
import (
"bufio"
"bytes"
"fmt"
"log"
"os"
)
func main() {
var buffer bytes.Buffer
scanner := bufio.NewScanner(os.Stdin)
for {
done := scanner.Scan()
buffer.WriteString(scanner.Text())
if done == true {
if scanner.Err() != nil {
log.Fatal("Error scanning input")
}
break
}
}
fmt.Println(buffer.String())
}
最佳答案
这段代码的主要问题是scanner.Scan的返回值不是true
,如果scanner完成,而是true
,如果scanner没有完成。
在我们解决这个问题的同时,让我们整理另一件事,因为您不需要使用
if done == true
但可以简单地做
if done
另外,请记住
done = Scanner.Text()
和作为终止条件,我们可以很好地整理代码:for scanner.Scan() { // This does what you want, looping until scanner
// is no longer true.
buffer.WriteString(scanner.Text())
}
if err := scanner.Err(); err != nil { // Let's hold on to err...
log.Fatalf("Error scanning input: %s", err) // and use it here.
}
您可以丢弃很多行,并且只在循环结束时检查 Err() 一次。无需使用中断。
希望对您有用,如果您需要其他东西,请给我留言。
编辑:还有两件事需要注意。
1)
bufio.Scanner.Scan()
会吃掉你所有的分隔符。也许没关系,或者您想继续将它们添加回来。2) 如果您的 SplitFunc 错误,或者有人为您的 SplitFunc 制作了糟糕的输入,
bufio.Scanner.Scan()
可能会 panic ,如果缓冲区太大,bytes.Buffer.WriteString()
可能会 panic 。如果您在生产系统中使用这些,请确保以任何有意义的方式处理这些 panic 。关于Go - 如何增加最大标准输入长度?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34189401/