Как читать со стандартного ввода в консоли?

Я хотел бы прочитать стандартный ввод из командной строки, но мои попытки закончились выходом из программы, прежде чем меня попросят ввести. Я ищу эквивалент 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)