首頁 >後端開發 >Golang >為什麼 Go 的 `fmt.Scanf` 不總是等待使用者輸入?

為什麼 Go 的 `fmt.Scanf` 不總是等待使用者輸入?

Patricia Arquette
Patricia Arquette原創
2024-12-15 10:13:10933瀏覽

Why Doesn't Go's `fmt.Scanf` Always Wait for User Input?

為什麼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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn