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 關注
- 378 瀏覽
添加回答
舉報