コマンドラインから入力を読みたいのですが、入力を求めるプロンプトが表示される前にプログラムが終了してしまいました。 C#で Console.ReadLine() と同等のものを探しています。
これは私が現在持っているものです:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter text: ")
text, _ := reader.ReadString('\n')
fmt.Println(text)
fmt.Println("Enter text: ")
text2 := ""
fmt.Scanln(text2)
fmt.Println(text2)
ln := ""
fmt.Sscanln("%v", ln)
fmt.Println(ln)
}
ブロックの何が問題なのかわからない
reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter text: ")
text, _ := reader.ReadString('\n')
fmt.Println(text)
それは私のマシン上で動作します。ただし、次のブロックには、入力を割り当てている変数へのポインタが必要です。 fmt.Scanln(text2)
をfmt.Scanln(&text2)
に置き換えてみてください。 Sscanln
は使用しないでください。標準入力からではなく、すでにメモリ内にある文字列を解析するためです。自分がやろうとしていたようなことをしたいのなら、それをfmt.Scanf("%s", &ln)
に置き換えてください。
それでも問題が解決しない場合は、原因が変わったシステム設定やバグのあるIDEなどです。
あなたも試してみることができます:
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
if scanner.Err() != nil {
// handle error.
}
これを行うためのより標準的な方法は次のようになると思います。
package main
import "fmt"
func main() {
fmt.Print("Enter text: ")
var input string
fmt.Scanln(&input)
fmt.Print(input)
}
scan
godocを見てください: http://godoc.org/fmt#Scan
Scanは標準入力から読み込まれたテキストをスキャンし、連続したスペース区切りの値を連続した引数に格納します。改行はスペースとして数えます。
ScanlnはScanに似ていますが、改行でスキャンを停止し、最後の項目の後に改行またはEOFがなければなりません。
コンソールから入力を収集するには、常に bufio.NewScanner を使用するようにしてください。他の人が述べたように、仕事をする複数の方法がありますが、Scannerはもともと仕事をすることを意図しています。 Dave Cheneyが、bufio.ReaderのReadLineの代わりにScannerを使用する理由を説明します。
https://Twitter.com/davecheney/status/604837853344989184?lang=ja
これがあなたの質問に対するコードスニペットの答えです。
package main
import (
"bufio"
"fmt"
"os"
)
/*
Three ways of taking input
1. fmt.Scanln(&input)
2. reader.ReadString()
3. scanner.Scan()
Here we recommend using bufio.NewScanner
*/
func main() {
// To create dynamic array
arr := make([]string, 0)
scanner := bufio.NewScanner(os.Stdin)
for {
fmt.Print("Enter Text: ")
// Scans a line from Stdin(Console)
scanner.Scan()
// Holds the string that scanned
text := scanner.Text()
if len(text) != 0 {
fmt.Println(text)
arr = append(arr, text)
} else {
break
}
}
// Use collected inputs
fmt.Println(arr)
}
プログラム的に入力を収集したくない場合は、これらの行を追加するだけです。
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
text := scanner.Text()
fmt.Println(text)
上記のプログラムの出力は次のようになります。
Enter Text: Bob
Bob
Enter Text: Alice
Alice
Enter Text:
[Bob Alice]
上記のプログラムはユーザー入力を集めてそれらを配列に保存します。その流れを特別なキャラクターで破ることもできます。 Scannerは、カスタム関数などを使った分割、さまざまなタイプのI/Oストリーム(Stdin、String)などのスキャンなどの高度な使用法のためのAPIを提供します.
スペースを含む入力を処理できるループ内で複数の入力を読み取る別の方法
package main
import (
"fmt"
"bufio"
"os"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
var text string
for text != "q" { // break the loop if text == "q"
fmt.Print("Enter your text: ")
scanner.Scan()
text = scanner.Text()
if text != "q" {
fmt.Println("Your text was: ", text)
}
}
}
出力:
Enter your text: Hello world!
Your text was: Hello world!
Enter your text: Go is awesome!
Your text was: Go is awesome!
Enter your text: q
このコードを試してください: -
var input string
func main() {
fmt.Print("Enter Your Name=")
fmt.Scanf("%s",&input)
fmt.Println("Hello "+input)
}
私はパーティーに遅れた。しかし、1つのライナーはどうでしょうか。
data, err := ioutil.ReadAll(os.Stdin)
このようにすることもできます: -
package main
import "fmt"
func main(){
var myname string
fmt.Scanf("%s", &myname)
fmt.Println("Hello", myname)
}
いくつかのプロンプト値をきれいに読んでください。
// Create a single reader which can be called multiple times
reader := bufio.NewReader(os.Stdin)
// Prompt and read
fmt.Print("Enter text: ")
text, _ := reader.ReadString('\n')
fmt.Print("Enter More text: ")
text2, _ := reader.ReadString('\n')
// Trim whitespace and print
fmt.Printf("Text1: \"%s\", Text2: \"%s\"\n",
strings.TrimSpace(text), strings.TrimSpace(text2))
これが実行です。
Enter text: Jim
Enter More text: Susie
Text1: "Jim", Text2: "Susie"
次のように、スキャンしたい変数へのポインタを指定する必要があります。
fmt.scan(&text2)