Как читать со стандартного ввода в консоли?
Я хотел бы прочитать стандартный ввод из командной строки, но мои попытки закончились выходом из программы, прежде чем меня попросят ввести. Я ищу эквивалент 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)
}
Ответы
Ответ 1
Я не уверен, что случилось с блоком
reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter text: ")
text, _ := reader.ReadString('\n')
fmt.Println(text)
Как работает на моей машине. Однако для следующего блока вам нужен указатель на переменные, которым вы назначаете вход. Попробуйте заменить fmt.Scanln(text2)
на fmt.Scanln(&text2)
. Не используйте Sscanln
, потому что он анализирует строку уже в памяти вместо stdin. Если вы хотите сделать что-то вроде того, что вы пытались сделать, замените его на fmt.Scanf("%s", &ln)
Если это все еще не работает, вашим виновником могут быть некоторые странные системные настройки или глючная среда IDE.
Ответ 2
вы также можете попробовать:
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
if scanner.Err() != nil {
// handle error.
}
Ответ 3
Я думаю, что более стандартный способ сделать это:
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
Сканирование сканирует текст, считанный со стандартного ввода, сохраняя последовательные значения, разделенные пробелами, в последовательные аргументы. Новые строки считаются пробелом.
Scanln похож на Scan, но останавливает сканирование в новой строке, и после последнего элемента должна быть новая строка или EOF.
Ответ 4
Всегда старайтесь использовать bufio.NewScanner для сбора ввода с консоли. Как уже упоминалось, существует несколько способов выполнить эту работу, но первоначально изначально планировалось выполнить эту работу. Дэйв Чейни объясняет, почему вы должны использовать Scanner вместо bufio.Reader ReadLine.
https://twitter.com/davecheney/status/604837853344989184?lang=en
Вот ответ фрагмента кода для вашего вопроса
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]
Выше программы собирает пользовательский ввод и сохраняет их в массив. Мы также можем разбить этот поток со специальным характером. Сканер предоставляет API для расширенного использования, например, разделение с использованием пользовательской функции и т.д., Сканирование различных типов потоков ввода-вывода (Stdin, String) и т.д.
Ответ 5
Другой способ чтения нескольких входов в цикле, который может обрабатывать ввод с пробелами:
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
Ответ 6
Попробуйте этот код: -
var input string
func main() {
fmt.Print("Enter Your Name=")
fmt.Scanf("%s",&input)
fmt.Println("Hello "+input)
}
Ответ 7
Я опаздываю на вечеринку. Но как насчет одного лайнера:
data, err := ioutil.ReadAll(os.Stdin)
Ответ 8
Также можно сделать так: -
package main
import "fmt"
func main(){
var myname string
fmt.Scanf("%s", &myname)
fmt.Println("Hello", myname)
}
Ответ 9
Чисто прочитайте в пару запрошенных значений:
// 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"
Ответ 10
Вы можете использовать закрытие для абстрагирования вещи:
func makeReader() func(string) string {
reader := bufio.NewReader(os.Stdin)
return func (s string) string {
fmt.Println(s)
txt, _ := reader.ReadString('\n')
return txt
}
}
Ответ 11
Вам нужно указать указатель на var, который вы хотите сканировать, например:
fmt.scan(&text2)
Ответ 12
Я знаю, что этот вопрос уже принят. Это для других людей, которые могут наткнуться на это. Этот пакет может помочь:
https://github.com/steven-ferrer/gonsole
Он может читать входы из файла, stdin и других, которые реализуют io.Reader
несколько как сканер в java.
Ответ 13
В моем случае программа не ждала, потому что я использовал команду watcher
для автоматического запуска программы. Запуск программы go run main.go
вручную привел к "Вводу текста" и в конечном итоге к печати на консоли.
fmt.Print("Enter text: ")
var input string
fmt.Scanln(&input)
fmt.Print(input)