【发布时间】:2014-03-11 09:54:05
【问题描述】:
我有一个很大的缓冲区(缓冲区 [] 字节),我想将其打印到标准输出,但要通过传呼机(例如更少或更多)进行管道传输。有点像 man 命令。我不想先将缓冲区写入 tmp 文件或让用户手动将输出通过管道传输到命令行上的寻呼机。
我可以找到 examples 来了解如何将一个命令的输出通过管道传输到另一个命令,但没有从内部缓冲区开始。
有什么想法吗? 谢谢。
【问题讨论】:
标签: go
我有一个很大的缓冲区(缓冲区 [] 字节),我想将其打印到标准输出,但要通过传呼机(例如更少或更多)进行管道传输。有点像 man 命令。我不想先将缓冲区写入 tmp 文件或让用户手动将输出通过管道传输到命令行上的寻呼机。
我可以找到 examples 来了解如何将一个命令的输出通过管道传输到另一个命令,但没有从内部缓冲区开始。
有什么想法吗? 谢谢。
【问题讨论】:
标签: go
为了通过管道传送到寻呼机,您可以执行以下操作:
package main
import (
"fmt"
"io"
"os"
"os/exec"
)
func main() {
// declare your pager
cmd := exec.Command("less")
// create a pipe (blocking)
r, stdin := io.Pipe()
// Set your i/o's
cmd.Stdin = r
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
// Create a blocking chan, Run the pager and unblock once it is finished
c := make(chan struct{})
go func() {
defer close(c)
cmd.Run()
}()
// Pass anything to your pipe
fmt.Fprintf(stdin, "hello world\n")
// Close stdin (result in pager to exit)
stdin.Close()
// Wait for the pager to be finished
<-c
}
【讨论】:
cmd.Start() 和 cmd.Wait() 来消除阻塞通道的需要?
<-c。所以如果需要异地等待,最好不要依赖Wait。
听起来您需要的是Encoder。您正在使用寻呼机的软件包吗?如果是这样,您可能想在包中查找编码器,或者如果没有提供,请创建自己的编码器。
这是一个示例,说明如何使用 JSON 编码器来实现与您尝试做的类似的事情:
b := []byte(`{ ... some json object ... }`)
json_encoder := json.NewEncoder(os.Stdout)
json_encoder.Encode(b)
在此示例中,JSON 编码器接受 []byte 并执行所有工作以将其编码为 JSON 文档并写入提供的 io.writer。如果您正在使用一个包并且它不提供编码器,您可以通过查看JSON Encoder 源代码来创建自己的源代码来了解如何编写一个。
【讨论】: