使用Golang从标准输入读取长文本

4
我想从os.Stdin读取一段长文本,但无法实现。已经阅读了关于这个主题的所有内容,并尝试了可以正常工作的代码。每种方法都会在4096个字符后截断,不论如何。

例如:此处是一个可行的示例。在循环第一次运行后,它会读取前4096个字符,然后等待更多的处理,直到我用EOF(Ctrl+D)结束为止。对于fmt.Scan、bufio.NewScanner、bufio ReadLine、ioutil.ReadAll都是一样的。如果我将其保存到文件中并读取它,则可以按预期工作。但从stdin读取则不行。

我使用Arch Linux、32位、Go 1.7,在mate-terminal 1.14、tty 8.25中测试,两者都是一样的。在hackerrank.com页面上也是同样的情况,我不知道他们使用的是什么技术。

请帮帮我!

编辑:

我的输入比4096个字符略长一点。我查看了Amd分享的链接,得到以下信息:我的输入只有一行,包含用空格分隔的整数。当我将空格改为换行符时,它可以工作。但由于hackerrate上的练习格式使用长的以空格分隔的行,所以问题仍然存在,需要进行改进。

你的输入文本大小是多少?你是一次性输入所有文本还是分段输入?在 HackerRank 上提供该问题的链接。请参阅:https://dev59.com/bF0Z5IYBdhLWcg3wiw0v - user6169399
1个回答

1
我能够解决这个问题,多亏了Ian Lance Taylor: https://groups.google.com/forum/#!topic/golang-nuts/ndh-1wdsWYs 因此,4096个字符是通过N_TTY_BUF_SIZE内核参数限制的系统上限。相同的方法在cat和Python中也适用。
无论如何,在hackerrank.com上,我能够用Python解决相同的练习,所以我猜他们对Go的配置有误,我已经要求他们找出原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接