如何使用Bash自动化两个os.Stdin输入
我需要自动化代码段的输入,比如bellow,其中ReadString的输入是不同的如何使用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 {
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字节,否则它将读取整个内容,因此第二个读卡器将无需读取任何内容。我还认为可能会发生这种情况。但我无法控制程序代码。难道没有办法为这种情况产生输入吗?