Rumah > pembangunan bahagian belakang > Golang > Mengapa `fmt.Scanf` Go Tidak Sentiasa Menunggu Input Pengguna?

Mengapa `fmt.Scanf` Go Tidak Sentiasa Menunggu Input Pengguna?

Patricia Arquette
Lepaskan: 2024-12-15 10:13:10
asal
925 orang telah melayarinya

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

Mengapa Fmt.Scanf dalam Go Tidak Menunggu Input Pengguna

Dalam buku pengaturcaraan Caleb Doxsey's Go, timbul persoalan berkenaan penggunaan fmt.Scanf. Isu ini berpunca daripada fakta bahawa program tidak berhenti seketika selepas Scanf kedua, mengharapkan input pengguna. Selain itu, tugas untuk mengesahkan input pengguna, khususnya integer dan nilai bukan kosong, perlu ditangani.

Untuk memahami tingkah laku ini, kita perlu menyelidiki cara dalaman fmt.Scanf. Dalam versi terdahulu Go, fmt.Scanf mempunyai had: ia menganggap carriage return (r) diikuti dengan baris baharu (n) sebagai aksara baris baharu yang sah. Walau bagaimanapun, tingkah laku ini bercanggah dengan konvensyen Windows menggunakan hanya r sebagai watak baris baharu. Akibatnya, fmt.Scanf akan terus ke Scanf seterusnya tanpa menunggu input pengguna.

Untuk menyelesaikan isu ini dan menambah baik pengendalian input, pertimbangkan kod diubah suai berikut yang termasuk semakan untuk input yang sah:

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)
    }
}
Salin selepas log masuk

Pemasukan "n" dalam rentetan format memastikan bahawa fmt.Scanf hanya diteruskan apabila pengguna telah memasuki baris baharu, menghapuskan isu tersebut daripadanya bergerak ke hadapan tanpa menunggu input. Selain itu, kami kini mempunyai pengesahan input menggunakan pembolehubah n dan err yang dikembalikan oleh Scanf. Jika n tidak sama dengan 1, ia menunjukkan bahawa terdapat ralat atau pengguna tidak memasukkan sebarang input yang sah. err menyediakan konteks tambahan tentang ralat yang berlaku.

Kesimpulannya, fmt.Scanf berkelakuan secara tidak dijangka pada masa lalu disebabkan isu keserasian pada Windows. Walau bagaimanapun, isu ini telah diselesaikan dan menggunakan semakan baris baharu dalam rentetan format memastikan ia kini menunggu input pengguna. Selain itu, kemasukan pengesahan input membolehkan kami mengesahkan sama ada pengguna telah memasukkan nilai yang sah, seperti integer atau respons bukan kosong.

Atas ialah kandungan terperinci Mengapa `fmt.Scanf` Go Tidak Sentiasa Menunggu Input Pengguna?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan