0

ユーザーから入力を取得していますが、後で文字列リテラルと比較しようとすると機能しません。それはただのテストです。

空白行が入力されると(エンター/リターンキーを押すだけで)プログラムが終了するように設定したいと思います。印刷すると同じ結果になるため、文字列が比較されない理由がわかりません。

in := bufio.NewReader(os.Stdin); 
input, err := in.ReadBytes('\n');

if err != nil {
    fmt.Println("Error: ", err)
}

if string(input) == "example" {
    os.Exit(0)
}
4

1 に答える 1

4

文字列 vs [] バイト

文字列定義:

string8 ビット バイトのすべての文字列のセットであり、従来通りですが、必ずしも UTF-8 でエンコードされたテキストを表すとは限りません。文字列は空でも構いませんが、nil ではありません。文字列型の値は不変です。

バイト定義:

byte は uint8 のエイリアスであり、すべての点で uint8 と同等です。慣例により、バイト値を 8 ビットの符号なし整数値と区別するために使用されます。

どういう意味ですか?

  • []bytebyteスライスです。スライスは空にすることができます。
  • string要素は Unicode 文字であり、1 バイトを超えることができます。
  • string要素はデータ (エンコーディング) の意味を保持しますが、保持し[]bytesません。
  • 等値演算子は型に対して定義されていますstringが、型に対して定義されていませんslice

ご覧のとおり、これらは異なるプロパティを持つ 2 つの異なるタイプです。さまざまな文字列関連の型を説明する素晴らしいブログ投稿があります [1]。

コード スニペットにある問題についてお知らせします。

包括的in.ReadBytes(char)にバイトスライスを返すことに注意してください。charしたがって、コードinputでは '\n' で終わります。コードを希望どおりに動作させたい場合は、次を試してください。

if string(input) == "example\n" { // or "example\r\n" when on windows
    os.Exit(0)
}

また、端末のコード ページが.goソース ファイルと同じであることを確認してください。さまざまな行末スタイルに注意してください (Windows は "\r\n" を使用します)。標準の go コンパイラは内部で utf8 を使用します。

[1]文字列処理のための Go データ型の比較。

于 2013-09-24T02:18:17.967 に答える