Rumah >pembangunan bahagian belakang >Golang >Mengapa `fmt.Scanf` Go Tidak Sentiasa Menunggu Input Pengguna?
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) } }
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!