2016-03-23 8 views
-1

を処理していない私はgolangで新たなんだと、私は次のコードの作業を取得することができない理由を私は理解していない:Golangは2つの操作

func ListApps(){ 
    fmt.Printf("\nPress Q to go back..\n") 
    reader := bufio.NewReader(os.Stdin) 
    input, _ := reader.ReadString('\n') 

    if string(input) == "q" { 
     fmt.Printf("OK") 
    } 
} 

私はメッセージを印刷したい場合、スキャン、ユーザーのコンソールで入力し、imputが文字列 "q"と等しい場合は、入力と印刷のmessafeを比較します。最後のチェックは何らかの理由で機能しません。 TFMから

答えて

5

ReadStringがまでのデータを含む文字列を返す、入力におけるDELIMの最初の発生まで、読み出しおよびデリミタ

含め、文字列を比較しますデリミタなしで。

だからやって:

if input == "q\n" {...} 

すること(入力がすでに文字列であるようstring(input)を呼び出すところで不要)を動作しないだろう。

を使用して、チェックする前にエンドラインをトリミングすることもできます。これにより、コードをより移植性の高いものにすることができます.Windows上では\r\nを使用して行を区切ります。これを行うには:

input = strings.TrimRight(input, "\r\n") 
if input == "q" { 
    fmt.Println("OK") 
} 

そして私は自分自身を動作させるためにこれをテストしました。

+0

これは何らかの理由で動作しません - http://screencast.com/t/3ypSrlZsB – Vnuuk

+0

@Vnuukそれは私のために働く。あなたの端末が\ nではなく\ r \ nを使用している可能性があります。だからこそ、トリミングの第2のアプローチは、移植性があるので、よりうまくいくでしょう。 –

+0

ありがとう!ところで - 私はWindows端末を使用しています – Vnuuk

2

Not_a_Golferはなぜ機能しないのかについては正しいです。しかし、STDINからの読み込みのような単純なもののためにあなたが使用してスキャナの方がいいでしょう:関係なく、入力から提示されたところの、これは動作します

func ListApps(){ 
    fmt.Printf("\nPress Q to go back..\n") 
    reader := bufio.NewScanner(os.Stdin) 
    reader.Scan() // this line scans the STDIN for input 

    // error checking... 
    if err := scanner.Err(); err != nil { 
     panic(err) 
    } 

    // To access what the scanner got, you use scanner.Text() (reader.Text() in this case) 
    if reader.Text() == "q" { 
     fmt.Printf("OK") 
    } 
} 

(窓はなど、Linuxのターミナル/ OSX、コマンドプロンプト)

+1

合意しました。ありがとう! –