我是 Go 的新手(就像在最后一天一樣)并且正在玩一個處理來自 stdin 的數(shù)據(jù)的簡單程序。我想要做的是,如果沒有向標準輸入提供數(shù)據(jù),那么程序?qū)⑤敵鲆粋€幫助屏幕,然后退出。我遇到的問題是,當沒有通過標準輸入提供數(shù)據(jù)時,程序似乎無限期掛起。這是該程序和我的預(yù)期用途的簡短示例:package mainimport ( "fmt" "bufio" "os")func main() { scanner := bufio.NewScanner(os.Stdin) scanner.Split(bufio.ScanLines) for scanner.Scan() { str := scanner.Text() fmt.Println(str) }}Running with input:go run test.go < lines.txtline1line2line3Running with no input:go run test.go我不提供輸入的第二種情況是導(dǎo)致程序掛起的原因。通讀文檔,我不清楚如何編寫程序以不無限期地等待輸入,而是在 stdin 上不存在任何內(nèi)容時中斷。
2 回答

慕姐4208626
TA貢獻1852條經(jīng)驗 獲得超7個贊
該程序的行為與代碼所說的完全一樣。代碼說從標準輸入讀取。可以通過重定向提供 stdin 的輸入(如您所示)?;蛘咄ㄟ^管道?;蛘?... 或者通過用戶在鍵盤上打字。如果在最后一種情況下程序會在人類進入某些東西之前退出,那將是非常令人驚訝的。
一種常見的方法是執(zhí)行類似(簡化)的操作:
var in *os.File
var err error
switch name := flag.Arg(0); {
case name == "":
in = os.Stdin
default:
if in, err = os.Open(name); err != nil {
log.Fatal(err)
}
}
IE。允許處理作為命令行參數(shù)給出的命名文件 - 但當沒有文件名參數(shù)提供給程序時,回退/默認讀取標準輸入。
這種方法可以很好地與 shell 腳本、通過管道鏈接命令等配合使用。
- 2 回答
- 0 關(guān)注
- 330 瀏覽
添加回答
舉報
0/150
提交
取消