Rumah >pembangunan bahagian belakang >Golang >Mengapakah `bufio.Reader.ReadString` Go Memelihara Pembatas Utama, dan Bagaimana Saya Boleh Mengelak Isu Ini?

Mengapakah `bufio.Reader.ReadString` Go Memelihara Pembatas Utama, dan Bagaimana Saya Boleh Mengelak Isu Ini?

Susan Sarandon
Susan Sarandonasal
2024-12-18 05:10:11283semak imbas

Why Does Go's `bufio.Reader.ReadString` Preserve Leading Delimiters, and How Can I Avoid This Issue?

Reader.ReadString Mungkin Mengekalkan Pembatas Utama

Dalam Go, gelagat bufio.Reader.ReadString boleh berbeza apabila menghuraikan input. Pertimbangkan senario berikut:

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("Who are you? Enter your name: ")
    text, _ := reader.ReadString('\n')
    if text == "Alice" || text == "Bob" {
        fmt.Printf("Hello, ", text)
    } else {
        fmt.Printf("You're not allowed in here!")
    }
}

Di sini, ReadString digunakan untuk membaca input pengguna dan menjangkakan nama ditamatkan oleh aksara baris baharu. Walau bagaimanapun, apabila nama yang dimasukkan sepadan dengan "Alice" atau "Bob," program ini tersilap menafikan akses.

Punca dan Penyelesaian

Isu ini timbul kerana ReadString mengekalkan kejadian utama daripada pembatas (dalam kes ini, 'n'). Apabila nama seperti "Alice" dimasukkan, rentetan yang disimpan dalam teks termasuk kedua-dua "Alice" dan baris baharu yang mengekori. Watak baris baharu tambahan ini menghalang perbandingan rentetan daripada sepadan dengan nilai yang dijangkakan.

Untuk menyelesaikan isu ini, pertimbangkan pendekatan berikut:

  1. Pangkas Ruang Putih Utama: Sebelum membandingkan teks dengan "Alice" atau "Bob," gunakan rentetan.TrimSpace(teks) untuk mengalih keluar mana-mana ruang putih utama, termasuk baris baharu watak.
  2. Gunakan ReadLine Sebaliknya: Sebagai alternatif, tukar kepada reader.ReadLine() dan bukannya ReadString. Fungsi ini mengembalikan input tanpa menyertakan sebarang pembatas di hadapan atau di belakang. Ambil perhatian bahawa reader.ReadLine() akan mengembalikan bait; oleh itu, hantarkannya ke rentetan menggunakan rentetan(bait).

Atas ialah kandungan terperinci Mengapakah `bufio.Reader.ReadString` Go Memelihara Pembatas Utama, dan Bagaimana Saya Boleh Mengelak Isu Ini?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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