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

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

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

Go
Smart猫小萌 2022-08-24 10:54:56
我试图获取输入(许多数字带有空格)并将其转换为切片。数字数量最多为 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*300000buf := make([]byte, maxCapacity)scanner.Buffer(buf, maxCapacity)scanner.Scan()input := scanner.Text()nums := ChangeToInt(input)  但仍然不起作用。怎么了?
查看完整描述

2 回答

?
千巷猫影

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

您正在使用 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().


查看完整回答
反对 回复 2022-08-24
?
ibeautiful

TA贡献1993条经验 获得超6个赞

您可以使用 及其方法。对于大型输入数据来说,这将是有好处的。bufio.NewReaderReadString('\n')



查看完整回答
反对 回复 2022-08-24
  • 2 回答
  • 0 关注
  • 100 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号