如何通过寻呼机将缓冲区打印到标准输出?

时间:2014-02-12 20:16:13

标签: go

我有一个大缓冲区(buffer [] byte),我想打印到stdout,但通过寻呼机管道,如更少或更多。有点像男人的命令。我不想先将缓冲区写入tmp文件,或者让用户手动将输出传递给命令行上的寻呼机。

我可以找到examples如何将一个命令的输出传递给另一个命令,但没有任何东西以内部缓冲区开头。

有什么想法吗? 感谢。

2 个答案:

答案 0 :(得分:2)

为了管道到寻呼机,你可以这样做:

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
}

答案 1 :(得分:0)

听起来你需要的是Encoder。您是否正在使用寻呼机包?如果是这样,您可能想要在包中查找编码器,或者如果没有提供编码器,则创建自己的编码器。

以下是如何使用JSON编码器实现类似于您尝试执行的操作的示例:

b := []byte(`{ ... some json object ... }`)
json_encoder := json.NewEncoder(os.Stdout)
json_encoder.Encode(b)

在此示例中,JSON编码器接受[]字节并完成所有工作以将其编码为JSON文档并写入提供的io.writer。如果你正在使用一个软件包并且它没有提供编码器,你可以通过查看JSON Encoder源代码来创建自己的编码,从而获得如何编写编码器的想法。