一分钟学会在 Go 程序中实现管道 pipeline 功能

栏目: Go · 发布时间: 4年前

内容简介:乘着打盹的时间看了一眼前两天写的日期转换的开源工具:但凡在类 Unix 系统上敲过命令的人,大多使用过管道功能. 所谓管道,就是将A程序的标准输出作为B程序的标准输入。而在类 Unix 系统只需要使用画了张简单的图:

乘着打盹的时间看了一眼前两天写的日期转换的开源工具: ts 。发现管道 pipeline 的功能点可以放大一下, 就此记录一下以备将来只需。

管道是什么

但凡在类 Unix 系统上敲过命令的人,大多使用过管道功能. 所谓管道,就是将A程序的标准输出作为B程序的标准输入。而在类 Unix 系统只需要使用 | 符号,连接 A 和 B 程序即可, 即 A | B 。通过多次管道连接,就可以实现非常强大的功能。所以在类 Unix 系统上开发命令行程序有个著名的原则: KISS ,即 Keep It Simple Stupid。

画了张简单的图:

一分钟学会在  <a href='https://www.codercto.com/topics/6127.html'>Go</a>  程序中实现管道 pipeline 功能

Go 程序

在 Go 程序中实现管道功能及其简单,直接上码:

//先取程序的标准输入属性信息
    info, err := os.Stdin.Stat()
    if err != nil {
        return errors.Annotate(err, "stdin stat failed")
    }

    // 判断标准输入设备属性 os.ModeCharDevice 是否设置
    // 同时判断是否有数据输入 
    if (info.Mode()&os.ModeCharDevice) == os.ModeCharDevice &&
        info.Size() > 0 {
        bytes, err := ioutil.ReadAll(os.Stdin)
        if err != nil {
            return errors.Annotate(err, "stdin read failed")
        }
        //TODO...
    }

属性 os.ModeCharDevice 的意思是标准输入的设备类型是Unix字节流设备(Unix character device)即终端(terminal)输入。该方式判断有一个注意点:

需要判断 info.Size() , 即标准输入是有数据输入的。如果终端没有输入的话,程序会在 ioutil.ReadAll 处阻塞。

所以使用这种方式需要了解不同条件设置的用途,请结合实际开发需求。除了这个方式以外,还有另外更加简单的实现方法:

// 直接判断 标准输入属性是否设置 os.ModeNamedPipe 即可
    if (info.Mode()&os.ModeNamedPipe) == os.ModeNamedPipe {
        //TODO...
    }

标准输入只有在存在输入的时候,才会设置 os.ModeNamedPipe 属性。相比较第一种方式,这种方式代码更加简单。只是命名管道(NamedPipe)又来了一个新概念,增加了理解的难度。引入一个 Linux 命令 mkfifo ,这个命令就是创建命名管道用的。至于为什么这里程序的 os.Stdin 属性会是 os.ModeNamedPipe ,我这先偷个懒了。


以上所述就是小编给大家介绍的《一分钟学会在 Go 程序中实现管道 pipeline 功能》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

个体与交互

个体与交互

Ken Howard、Barry Rogers / 贾永娜、张凯峰 / 机械工业出版社华章公司 / 2012-3-20 / 45.00元

对敏捷软件开发的关注重点,通常都集中在“机制”方面,即过程和工具。“敏捷宣言”认为,个体与交互的价值要高于过程和工具,但这一点很容易被遗忘。在敏捷开发中,如果你重新将注意力放在人的方面,将会收获巨大利益。 本书展示了如何解决敏捷团队在实际项目中遭遇的问题。同时,本书也是很有实用价值的敏捷用户指南,其中包含的故事、最佳实践方法、经验以及技巧均可应用到实际项目当中。通过逐步实践,你将学会如何让团......一起来看看 《个体与交互》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

SHA 加密
SHA 加密

SHA 加密工具