為什麼Go 中的Fmt.Scanf 不等待使用者輸入
在Caleb Doxsey 的Go 程式設計書中,出現了一個關於使用fmt .Scanf。這個問題源於這樣一個事實:程式在第二次 Scanf 之後不會暫停,等待使用者輸入。此外,還需要解決驗證使用者輸入(特別是整數和非空值)的任務。
要理解此行為,我們需要深入研究 fmt.Scanf 的內部運作原理。在 Go 的早期版本中,fmt.Scanf 有一個限制:它將回車符號 (r) 後面跟著換行符號 (n) 視為有效的換行符號。然而,這種行為與僅使用 r 作為換行符號的 Windows 約定發生衝突。因此,fmt.Scanf 將立即繼續執行下一個 Scanf,而無需等待使用者輸入。
要解決此問題並改進輸入處理,請考慮以下修改後的程式碼,其中包括對有效輸入的檢查:
import ( "fmt" ) func main() { var inputSquare float64 n, err := fmt.Scanf("%f\n", &inputSquare) if err != nil || n != 1 { fmt.Println(n, err) } var inputGuess float64 n, err = fmt.Scanf("%f\n", &inputGuess) if err != nil || n != 1 { fmt.Println(n, err) } }
在格式字串中包含「n」可確保fmt.Scanf 僅在使用者輸入新行後繼續,從而消除了不等待輸入而繼續前進的問題。此外,我們現在使用 Scanf 傳回的 n 和 err 變數進行輸入驗證。如果n不等於1,則表示有錯誤或使用者沒有輸入任何有效的輸入。 err 提供了有關所發生錯誤的附加上下文。
總之,由於 Windows 上的相容性問題,fmt.Scanf 過去的行為異常。但是,此問題已解決,並且在格式字串中使用換行符號檢查可確保它現在等待使用者輸入。此外,包含輸入驗證可讓我們驗證使用者是否輸入了有效值,例如整數或非空響應。
以上是為什麼 Go 的 `fmt.Scanf` 不總是等待使用者輸入?的詳細內容。更多資訊請關注PHP中文網其他相關文章!