亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將文件用作Stdin(Golang)時,在第二提示符下獲得EOF

將文件用作Stdin(Golang)時,在第二提示符下獲得EOF

Go
慕桂英4014372 2021-04-09 22:19:20
我正在嘗試對cli應用程序進行功能測試,類似于這種方式。當命令在命令提示符下詢問一些輸入時,我將它們放在文件中并將其設置為os.Stdin。cmd := exec.Command(path.Join(dir, binaryName), "myArg")tmpfile := setStdin("TheMasterPassword\nSecondAnswer\n12121212\n")cmd.Stdin = tmpfileoutput, err := cmd.CombinedOutput()在setStdin剛剛創建TMPFILE,寫在文件和返回字符串*os.File?,F在,我希望TheMasterPassword是第一個輸入,并且它正在運行。但是對于第二個輸入總是會得到Critical Error: EOF。我用于詢問和獲取用戶輸入的功能:func Ask(question string, minLen int) string {    reader := bufio.NewReader(os.Stdin)    for {        fmt.Printf("%s: ", question)        response, err := reader.ReadString('\n')        ExitIfError(err)        if len(response) >= minLen {            return strings.TrimSpace(response)        } else {            fmt.Printf("Provide at least %d character.\n", minLen)        }    }}您能幫我找出問題所在嗎?非常感謝!
查看完整描述

1 回答

?
幕布斯7119047

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()(使用默認的行拆分功能)將在返回行之前先去除該定界符。這也是您可以利用的簡化方式。


查看完整回答
反對 回復 2021-04-19
  • 1 回答
  • 0 關注
  • 378 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號