为了账号安全,请及时绑定邮箱和手机立即绑定

Go - 如何增加最大标准输入长度?

Go - 如何增加最大标准输入长度?

Go
慕标5832272 2021-11-29 15:39:53
从 Go 中的标准输入读取时允许超过 1024 个字符的推荐方法是什么?例如,此代码使用bufio.Scanner的最大输入长度为 1024。package mainimport (    "bufio"    "fmt"    "os")func main() {    scanner := bufio.NewScanner(os.Stdin)    scanner.Scan()    input := scanner.Text()    fmt.Println(input)}在一些建议的答案之后更新......对不起,我一定仍然做错了什么,或者错误地陈述了问题。我尝试了这两个建议,但仍然看到相同的问题。下面是代码的更新版本。症状是扫描仪不接受第 1024 个字符之后的输入。例如,尝试运行它然后粘贴一个长度为 1025 个字符的字符串,它会在字符 1024 之后停止接受输入。package mainimport (    "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())}
查看完整描述

3 回答

?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

你忽略了它的返回值,scanner.Scan()bool表明你是否已经到达终点。

具体来说:

当扫描停止时,它返回 false,无论是到达输入的末尾还是错误。Scan返回false后,Err方法会返回扫描过程中发生的任何错误,除非是io.EOF,Err会返回nil。

所以你需要继续scanner.Scan()循环运行,直到它返回false,然后检查.Err()以确保你没有因为非EOF错误而停止扫描。


查看完整回答
反对 回复 2021-11-29
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

这段代码的主要问题是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() 一次。无需使用中断。


希望这对您有用,如果您需要其他东西,请给我留言。


编辑:还有两件事需要注意。


1)bufio.Scanner.Scan()将吃掉你所有的分隔符。也许没关系,或者您可能想继续将它们重新添加进去。


2)bufio.Scanner.Scan()如果您的 SplitFunc 错误,或者有人为您的 SplitFunc 制作了糟糕的输入,则bytes.Buffer.WriteString()可能会发生恐慌,如果缓冲区太大,则可能会发生恐慌。如果您在生产系统中使用这些,请确保以任何有意义的方式处理这些恐慌。


查看完整回答
反对 回复 2021-11-29
?
慕仙森

TA贡献1827条经验 获得超7个赞

您可以这样做而不是使用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

        }

    }

}


查看完整回答
反对 回复 2021-11-29
  • 3 回答
  • 0 关注
  • 158 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信