Rumah >pembangunan bahagian belakang >Golang >Mengapakah fungsi Go `reader.ReadString` saya tidak memproses input pengguna dengan betul?
Menyelesaikan masalah "reader.ReadString" dalam Go
In Go, bufio.Reader menyediakan kaedah ReadString untuk membaca baris input daripada strim, berhenti pada aksara pembatas yang ditentukan. Walau bagaimanapun, apabila menggunakan kaedah ini untuk mendapatkan semula input pengguna, kadangkala boleh diperhatikan bahawa kejadian pertama pembatas tidak dilucutkan daripada rentetan yang dikembalikan.
Pertimbangkan kod berikut:
package main import ( "bufio" "fmt" "os" ) func main() { reader := bufio.NewReader(os.Stdin) fmt.Print("Who are you? \nEnter your name: ") text, _ := reader.ReadString('\n') if aliceOrBob(text) { fmt.Printf("Hello, ", text) } else { fmt.Printf("You're not allowed in here! Get OUT!!") } } func aliceOrBob(text string) bool { if text == "Alice" { return true } else if text == "Bob" { return true } else { return false } }
Apabila program ini dijalankan, ia menggesa pengguna untuk memasukkan nama mereka, tetapi walaupun pengguna memasukkan "Alice" atau "Bob", atur cara mencetak dengan salah "You're tidak dibenarkan masuk ke sini! Keluar!!".
Masalahnya terletak pada fakta bahawa kaedah ReadString membaca baris input sehingga pembatas yang ditentukan ditemui. Walau bagaimanapun, dalam tingkah laku lalainya, ia tidak mengalih keluar pembatas daripada rentetan yang dikembalikan. Ini bermakna apabila pengguna memasukkan "Alice", nilai teks sebenarnya akan menjadi "Alicen", yang tidak sepadan dengan mana-mana nama dalam fungsi aliceOrBob.
Untuk membetulkannya, seseorang boleh menggunakan rentetan sama ada .TrimSpace untuk mengalih keluar aksara baris baharu daripada teks sebelum menyemaknya dalam fungsi aliceOrBob:
import ( .... "strings" .... ) ... if aliceOrBob(strings.TrimSpace(text)) { ...
Sebagai alternatif, seseorang boleh menggunakan Kaedah ReadLine dan bukannya ReadString untuk membaca baris input daripada os.Stdin. ReadLine mengembalikan kepingan bait yang mewakili baris, tanpa aksara baris baharu. Walau bagaimanapun, memandangkan aliceOrBob menjangkakan rentetan, seseorang perlu menukar kepingan bait kepada rentetan menggunakan fungsi rentetan:
... text, _, _ := reader.ReadLine() if aliceOrBob(string(text)) { ...
Atas ialah kandungan terperinci Mengapakah fungsi Go `reader.ReadString` saya tidak memproses input pengguna dengan betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!