1 回答
TA贡献1794条经验 获得超8个赞
它几乎看起来您的应用程序喜欢你的电话Ask(),每当你想一个单一的输入线。
在其中Ask()创建一个bufio.Reader要读取的内容os.Stdin。知道bufio.Reader-顾名思义-使用缓冲读取,这意味着它从其源读取的数据可能比其方法返回的数据更多(Reader.ReadString()在这种情况下)。这意味着,如果仅使用它来读取一个(或一些)行,而丢弃读取器,则会丢弃已缓冲的,未读取的数据。
因此,下次您Ask()再次致电尝试从中读取时os.Stdin,您将不会从上次中断的地方继续...
要解决这个问题,只有建立一个单一bufio.Reader的os.Stdin,它存储在例如一个全局变量,并且里面Ask(),总是用这种单一的读者。因此,缓冲和未读数据不会在Ask()调用之间丢失。当然,从多个goroutine调用该解决方案将无效,但从单个goroutine调用os.Stdin也不可行。
例如:
var reader = bufio.NewReader(os.Stdin)
func Ask(question string, minLen int) string {
}
另请注意,bufio.Scanner在您的情况下,使用起来会更容易。但是同样,bufio.Scanner可能还会从其源中读取比所需更多的数据,因此您也必须在bufio.Scanner此处使用共享。还要注意,Reader.ReadString()返回一个包含定界符(\n以您的情况为结尾的行)的字符串,您可能必须对其进行修剪,而Scanner.Text()(使用默认的行拆分功能)将在返回行之前先去除该定界符。这也是您可以利用的简化方式。
- 1 回答
- 0 关注
- 350 浏览
添加回答
举报