golang使用bufio读取大量数字。新扫描器

我试图获取输入(许多数字带有空格)并将其转换为切片。数字数量最多为 300,000


我得到了一个错误,我用谷歌搜索了它。并且缓冲区大小存在一些问题。所以我写了如下代码。


func ChangeToInt(input string) []int {

    var nums []int

    for _, word := range strings.Fields(input) {

        num, _ := strconv.Atoi(word)

        nums = append(nums, num)

    }

    return nums

}


scanner := bufio.NewScanner(os.Stdin)


maxCapacity := 4*300000

buf := make([]byte, maxCapacity)

scanner.Buffer(buf, maxCapacity)


scanner.Scan()

input := scanner.Text()

nums := ChangeToInt(input)  

但仍然不起作用。怎么了?


Smart猫小萌
浏览 101回答 2
2回答

千巷猫影

您正在使用 bufio。扫描仪读取您的输入。默认情况下读取行,并使用内部缓冲区来存储行。默认情况下,该行的最大长度可能为 bufio。MaxScanTokenSize,大小为 64 KB。如果您的行长于此值,您将收到错误。bufio.Scanner可以使用 Scanner.Buffer() 方法更改/增加内部缓冲区大小,但如果您的输入是空格分隔的数字列表,我建议更改 .Scanner如前所述,默认情况下,扫描程序按行拆分输入。相反,请将其更改为按单词拆分输入。bufio软件包具有“就绪”的拆分功能:bufio。扫描字。像这样使用它:scanner := bufio.NewScanner(os.Stdin) scanner.Split(bufio.ScanWords)现在是扫描仪。Text() 将返回单词(在本例中为数字)而不是完整行,因此默认的 64 KB 限制现在适用于单词,而不是行。您的数字应小于 64 KB。还要通过调用扫描程序检查扫描是否成功。Err().

ibeautiful

您可以使用 及其方法。对于大型输入数据来说,这将是有好处的。bufio.NewReaderReadString('\n')
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go