Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go-如何增加最大标准输入长度?_Go - Fatal编程技术网

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

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)

在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个字符之后的输入。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.这种情况: