как я могу получить данные от пользователя в Golang (fmt.scan)

Я не могу получить данные от пользователя в Golang с помощью fmt.scan().

package main

import "fmt"

func main() {
    fmt.Print("Enter text: ")
    var input string
    e, _ := fmt.Scanln(&input)
    fmt.Println(input)
    fmt.Println(e)
}

изображение кода

После остановки отладчика: изображение кода err добавилось в код, но ничего не произошло.

func main() {
    fmt.Print("Enter text: ")
    var input string
    e, err := fmt.Scanln(&input)
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        return
    }
    fmt.Println(input)
    fmt.Println(e)
}

Изображение после добавления ошибки в мой код. Что "недоступно" в следующей строке ( после моего входного значения: "51213")


person mohammad ghari    schedule 16.03.2019    source источник
comment
Пожалуйста, отредактируйте вопрос, чтобы включить код в виде текста.   -  person Cerise Limón    schedule 16.03.2019
comment
Проверьте на ошибки. Например, play.golang.org/p/CU9X2Xro7z-   -  person peterSO    schedule 16.03.2019
comment
@peterSO спасибо, я добавил ошибку в код, но ничего не произошло   -  person mohammad ghari    schedule 16.03.2019
comment
У меня это было выполнено на моем терминале UNIX, и все работало нормально. Вы хотите выполнить его на Powershell с помощью команды go run main.go   -  person tush4r    schedule 16.03.2019


Ответы (3)


У вашего кода нет проблем. Если вы создадите свой код с помощью go build и запустите двоичный файл непосредственно в терминале, вы увидите, что ваш код запускается.

Проблема, с которой вы столкнулись, связана с консолью отладки Delve и vscode. Консоль отладки vscode не поддерживает чтение из стандартного ввода. Вы можете проверить эту проблему: Не удается отлаживать программы, которые считываются из STDIN для получения подробной информации.

person Chun Liu    schedule 16.03.2019

Не нужно "е". Замените его символом подчеркивания и удалите оператор печати.


import (
    "fmt"
    "os"
)
func main() {
    fmt.Print("Enter text: \n")
    var input string
    _, err := fmt.Scanln(&input)
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        return
    }
    fmt.Println(input)
}
person VC Healy    schedule 21.10.2019

Для записи. Если вы хотите ввести числовое значение, fmt.Scan сохраняет значение в переменной в виде строки, если вы хотите выполнить с ним какую-либо математическую операцию, вам нужно преобразовать его либо в int, либо в число с плавающей запятой. Краткий пример:

func main() {
    fmt.Println("Type your age: ")

    var input string
    _, err := fmt.Scanln(&input)
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        return
    }
    fmt.Printf("%T\n", input)        // outputs string
    inputInt,_ := strconv.Atoi(input)   
    fmt.Printf("%T\n", inputInt)     // outputs int
    fmt.Printf("You were born in %d\n", 2021-inputInt)
}

Мне потребовалось время, чтобы понять это, надеюсь, это поможет!

person nigomeza    schedule 27.05.2021