ホームページ >バックエンド開発 >Golang >Go の `bufio.Reader.ReadString` が先頭の区切り文字を保持するのはなぜですか? この問題を回避するにはどうすればよいですか?

Go の `bufio.Reader.ReadString` が先頭の区切り文字を保持するのはなぜですか? この問題を回避するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-18 05:10:11283ブラウズ

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

Reader.ReadString May Preserve Leading Delimiters

Go では、入力を解析するときに bufio.Reader.ReadString の動作が異なる場合があります。次のシナリオを考えてみましょう:

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!")
    }
}

ここでは、ReadString はユーザー入力の読み取りに使用され、改行文字で終了する名前を想定しています。ただし、入力された名前が「Alice」または「Bob」と一致すると、プログラムは誤ってアクセスを拒否します。

原因と解決策

この問題は、ReadString が先頭の出現箇所を保持するために発生します。区切り文字 (この場合は「n」)。 「Alice」のような名前を入力すると、テキストに保存される文字列には「Alice」と末尾の改行の両方が含まれます。この余分な改行文字により、文字列比較が期待値と一致しなくなります。

この問題を解決するには、次の方法を検討してください。

  1. 先頭の空白を削除します: Beforeテキストを「Alice」または「Bob」と比較するには、strings.TrimSpace(text) を使用して、改行を含む先頭の空白を削除します。 Character.
  2. 代わりに ReadLine を使用します: あるいは、ReadString の代わりに Reader.ReadLine() に切り替えます。この関数は、先頭または末尾の区切り文字を含めずに入力を返します。 Reader.ReadLine() はバイトを返すことに注意してください。したがって、string(bytes) を使用して文字列にキャストします。

以上がGo の `bufio.Reader.ReadString` が先頭の区切り文字を保持するのはなぜですか? この問題を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。