Heim >Backend-Entwicklung >Golang >Warum wartet „fmt.Scanf' von Go nicht immer auf Benutzereingaben?

Warum wartet „fmt.Scanf' von Go nicht immer auf Benutzereingaben?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-15 10:13:10929Durchsuche

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

Warum Fmt.Scanf in Go nicht auf Benutzereingaben wartet

Im Go-Programmierbuch von Caleb Doxsey stellt sich eine Frage bezüglich der Verwendung von fmt.Scanf. Das Problem ergibt sich aus der Tatsache, dass das Programm nach dem zweiten Scanf nicht anhält und Benutzereingaben erwartet. Darüber hinaus muss die Aufgabe der Validierung von Benutzereingaben, insbesondere Ganzzahlen und nicht leeren Werten, angegangen werden.

Um dieses Verhalten zu verstehen, müssen wir uns mit dem Innenleben von fmt.Scanf befassen. In früheren Versionen von Go hatte fmt.Scanf eine Einschränkung: Es betrachtete einen Wagenrücklauf (r) gefolgt von einem Zeilenumbruch (n) als gültiges Zeilenumbruchzeichen. Dieses Verhalten widersprach jedoch der Windows-Konvention, nur r als Zeilenumbruchzeichen zu verwenden. Infolgedessen würde fmt.Scanf sofort mit dem nächsten Scanf fortfahren, ohne auf Benutzereingaben zu warten.

Um dieses Problem zu beheben und die Eingabeverarbeitung zu verbessern, ziehen Sie den folgenden geänderten Code in Betracht, der Prüfungen auf gültige Eingaben enthält:

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)
    }
}

Die Einbeziehung von „n“ in die Formatzeichenfolge stellt sicher, dass fmt.Scanf erst dann fortfährt, wenn der Benutzer eine neue Zeile eingegeben hat, wodurch das Problem beseitigt wird, dass die Zeile fortgesetzt wird, ohne auf eine Eingabe zu warten. Darüber hinaus verfügen wir jetzt über eine Eingabevalidierung mithilfe der von Scanf zurückgegebenen Variablen n und err. Wenn n ungleich 1 ist, liegt ein Fehler vor oder der Benutzer hat keine gültige Eingabe gemacht. err bietet zusätzlichen Kontext zum aufgetretenen Fehler.

Zusammenfassend lässt sich sagen, dass sich fmt.Scanf in der Vergangenheit aufgrund eines Kompatibilitätsproblems unter Windows unerwartet verhalten hat. Dieses Problem wurde jedoch inzwischen behoben und durch die Verwendung einer Zeilenumbruchprüfung in der Formatzeichenfolge wird sichergestellt, dass nun auf Benutzereingaben gewartet wird. Darüber hinaus können wir durch die Einbeziehung der Eingabevalidierung überprüfen, ob der Benutzer gültige Werte eingegeben hat, z. B. ganze Zahlen oder nicht leere Antworten.

Das obige ist der detaillierte Inhalt vonWarum wartet „fmt.Scanf' von Go nicht immer auf Benutzereingaben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn