如何使用Bash自动化两个os.Stdin输入

如何使用Bash自动化两个os.Stdin输入,bash,go,Bash,Go,我需要自动化代码段的输入,比如bellow,其中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 {

我需要自动化代码段的输入,比如bellow,其中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输入。如何解决此问题?

发生这种情况是因为第二个字符串没有以换行符结尾。查看
ReadString
的文档:

如果ReadString在查找分隔符之前遇到错误,它将返回在错误之前读取的数据以及错误本身(通常是io.EOF)

所以,即使错误不是零,您也有数据。以下更改应适用于此特定情况:

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

通常,即使您从
ReadString
中得到错误,也可能会从函数返回非空数据。

这是因为第二个字符串没有以换行符结尾。查看
ReadString
的文档:

如果ReadString在查找分隔符之前遇到错误,它将返回在错误之前读取的数据以及错误本身(通常是io.EOF)

所以,即使错误不是零,您也有数据。以下更改应适用于此特定情况:

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

一般来说,即使您从
ReadString
中得到一个错误,您可能仍然会从函数返回非空数据。

我也尝试过使用以下命令-“`echo”data1 data2”`go run main.go``它返回与前一个相同的EOF。我无法控制源代码。因此,我只能尝试更改bash输入。然后在data2之后需要换行符。第一个读卡器可能会读取整个输入,因此当创建第二个读卡器时,没有任何内容可读取。不要创建第二个读卡器,使用第一个读卡器。如果您看到以下内容:,默认缓冲区大小为4096,因此,除非您的输入至少为4096字节,否则它将读取整个内容,因此第二个读卡器将无需读取任何内容。我还认为可能会发生这种情况。但我无法控制程序代码。有没有办法为这种情况生成输入?我也尝试过使用下面的命令-“`echo”data1 data2”| go run main.go``它返回与前一个相同的EOF。我无法控制源代码。因此,我只能尝试更改bash输入。然后在data2之后需要换行符。第一个读卡器可能会读取整个输入,因此当创建第二个读卡器时,没有任何内容可读取。不要创建第二个读卡器,使用第一个读卡器。如果您看到以下内容:,默认缓冲区大小为4096,因此,除非您的输入至少为4096字节,否则它将读取整个内容,因此第二个读卡器将无需读取任何内容。我还认为可能会发生这种情况。但我无法控制程序代码。难道没有办法为这种情况产生输入吗?