Rumah > pembangunan bahagian belakang > Golang > Mengapakah fungsi Go `reader.ReadString` saya tidak memproses input pengguna dengan betul?

Mengapakah fungsi Go `reader.ReadString` saya tidak memproses input pengguna dengan betul?

DDD
Lepaskan: 2024-12-14 03:21:10
asal
663 orang telah melayarinya

Why is my Go `reader.ReadString` function not correctly processing user input?

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

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

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

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan