Как автоматизировать два ввода os.Stdin, используя Bash - PullRequest
1 голос
/ 10 февраля 2020

Мне нужно автоматизировать ввод сегмента кода, как показано ниже, где входы ReadString различны.

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    buf := bufio.NewReader(os.Stdin)
    value, err := buf.ReadString('\n')
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(value)
    }

    buf = bufio.NewReader(os.Stdin)
    value, err = buf.ReadString('\n')
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(value)
    }
}

Я пробовал несколько форматов, таких как приведенный ниже, после ответов на этот вопрос , к сожалению, никто не работал.

>> echo "data1
data2" | go run main.go
output: data1

        EOF

Здесь data1 и data2 и ввод отдельных методов ReadString. У меня нет контроля над исходным кодом. Итак, я могу только попытаться изменить ввод bash. Как решить эту проблему?

1 Ответ

0 голосов
/ 10 февраля 2020

Это происходит потому, что вторая строка не заканчивается новой строкой. Просмотр документации для ReadString:

Если ReadString обнаруживает ошибку до нахождения разделителя, он возвращает данные, прочитанные до ошибки, и саму ошибку (часто io.EOF).

Итак, хотя ошибка не равна нулю, у вас есть данные. Следующее изменение должно работать для этого конкретного c случая:

buf = bufio.NewReader(os.Stdin)
value, err = buf.ReadString('\n')
if value!="" {
    fmt.Println(value)
}
if err != nil {
    fmt.Println(err)
}

В общем, даже если вы получаете ошибку от ReadString, вы все равно можете получить непустые данные, возвращаемые функцией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...