Go-如何增加最大标准输入长度?
在Go中读取标准输入时,建议使用什么方法允许超过1024个字符 例如,使用Go-如何增加最大标准输入长度?,go,Go,在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)
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个字符之后的输入。e、 g.尝试运行该命令,然后将其粘贴到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()
的返回值,该值是一个bool
,指示您是否已到达终点
具体而言:
当扫描停止时,它返回false(通过到达
输入错误或错误。扫描返回false后,Err方法将
返回扫描期间发生的任何错误,除非
io.EOF,Err将返回nil
因此,您需要在循环中继续运行
scanner.Scan()
,直到返回false,然后检查.Err()
,以确保您没有因为非EOF错误而停止扫描。您可以这样做,而不是使用scanner
reader := bufio.NewReaderSize(os.Stdin, 65536)
line, isPrefix, err := reader.ReadLine()
写一个帮助函数,直到你读完一行为止
func ReadLine(reader *bufio.Reader) (string, error) {
result := ""
for {
line, isPrefix, err := reader.ReadLine()
if err != nil {
return result, err
}
result += string(line)
if !isPrefix {
return result, nil
}
}
}
此代码的主要问题是,如果扫描仪已完成,scanner.Scan的返回值不是
true
,但如果扫描仪未完成,则返回true
在我们修复的过程中,让我们整理另一件东西,因为您不需要使用
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()。不需要使用break
希望这对你有用,如果你还需要别的东西,请给我写信
编辑:还有两件事需要注意
1) bufio.Scanner.Scan()
将吃掉您所有的分隔符令牌。也许没关系,或者你想继续把它们加进去
2)
bufio.Scanner.Scan()。如果您在生产系统中使用这些工具,请确保以任何合理的方式处理这些恐慌。is 64k。有一个问题,你不能通过将文本粘贴到终端来测试这一点。在烹调模式下,tty在内核中有一个硬编码的输入缓冲区,Linux上通常是4096,Darwin.Argh上通常是1024——谢谢JimB。我没有意识到这一点,这正是让我绊倒的原因。这是令人困惑的,因为我的终端工具(Darwin上的iTerm)在不作为命令的一部分运行时允许超过1024个字符。ReadString或ReadBytes可以为您做到这一点(从ReadLine文档:“大多数调用者应该使用ReadBytes('\n')或ReadString('\n'),或者使用扫描仪。”)谢谢FogleBird-我尝试了你的建议的一个变体,但仍然有与我上面提到的相同的问题。谢谢sberry-我尝试了这个建议,但仍然有问题。如果您有时间,请查看我的更新代码。将此标记为答案,因为它很好地清理了示例代码,因此非常感谢。JimB在问题中的评论也是我的问题。i、 e.这种情况: