这段代码的问题在于,stdout
和 stdin
的类型是 io.ReadCloser
和 io.WriteCloser
,但是 StdoutPipe()
和 StdinPipe()
返回的管道类型实际上是 io.Reader
和 io.Writer
。因此,我们需要将 stdout
和 stdin
的类型更改为 io.Reader
和 io.Writer
。
以下是修改后的代码:
package main
import (
"fmt"
"io"
"os/exec"
"time"
)
func main() {
// 进行字符串的替换,把小写字母替换成大写字母
cmd := exec.Command("tr", "a-z", "A-Z")
var (
err error
stdout io.ReadCloser
stdin io.WriteCloser
)
stdout, err = cmd.StdoutPipe()
if err != nil {
panic(err)
}
stdin, err = cmd.StdinPipe()
if err != nil {
panic(err)
}
// 这里协程给tr命令输入标准输入的 小写 abc 字符串
go func() {
for {
time.Sleep(time.Second)
stdin.Write([]byte("abc"))
}
}()
// 然后这里从标准输出读到上面输入后tr命令转换后的大写字符串 ABC
for {
data := make([]byte, 512)
n, err := stdout.Read(data)
if err != nil {
fmt.Println(err)
break
}
fmt.Println(string(data[:n]))
}
}
在这个修改后的代码中,我们将 stdout
和 stdin
的类型更改为 io.Reader
和 io.Writer
,然后从 stdout
中读取转换后的大写字符串。现在应该可以正常读取到输出结果了。
你如果是想写交互式命令行工具的话,我推荐一个包给你

github.com/AlecAivazis/survey/v2
参考文章你可以看这个
https://blog.csdn.net/zhanggqianglovec/article/details/127986871
这篇文章应该能帮助到你