《go语言程序设计》学习(八)

一,过滤

package main

import (
    "flag"
    "fmt"
    "log"
    "os"
    "path/filepath"
    "runtime"
    "strings"
)

func main() {
    runtime.GOMAXPROCS(runtime.NumCPU()) // Use all the machine‘s cores
    log.SetFlags(0)
    algorithm,
        minSize, maxSize, suffixes, files := handleCommandLine()

    if algorithm == 1 {
        sink(filterSize(minSize, maxSize, filterSuffixes(suffixes, source(files))))
    } else {
        channel1 := source(files)
        channel2 := filterSuffixes(suffixes, channel1)
        channel3 := filterSize(minSize, maxSize, channel2)
        sink(channel3)
    }
}

func handleCommandLine() (algorithm int, minSize, maxSize int64,
    suffixes, files []string) {
    flag.IntVar(&algorithm, "algorithm", 1, "1 or 2")
    flag.Int64Var(&minSize, "min", -1,
        "minimum file size (-1 means no minimum)")
    flag.Int64Var(&maxSize, "max", -1,
        "maximum file size (-1 means no maximum)")
    var suffixesOpt *string = flag.String("suffixes", "",
        "comma-separated list of file suffixes")
    flag.Parse()
    if algorithm != 1 && algorithm != 2 {
        algorithm = 1
    }
    if minSize > maxSize && maxSize != -1 {
        log.Fatalln("minimum size must be < maximum size")
    }
    suffixes = []string{}
    if *suffixesOpt != "" {
        suffixes = strings.Split(*suffixesOpt, ",")
    }
    files = flag.Args()
    return algorithm, minSize, maxSize, suffixes, files
}

func source(files []string) <-chan string {
    out := make(chan string, 1000)
    go func() {
        for _, filename := range files {
            out <- filename
        }
        close(out)
    }()
    return out
}

// make the buffer the same size as for files to maximize throughput
func filterSuffixes(suffixes []string, in <-chan string) <-chan string {
    out := make(chan string, cap(in))
    go func() {
        for filename := range in {
            if len(suffixes) == 0 {
                out <- filename
                continue
            }
            ext := strings.ToLower(filepath.Ext(filename))
            for _, suffix := range suffixes {
                if ext == suffix {
                    out <- filename
                    break
                }
            }
        }
        close(out)
    }()
    return out
}

// make the buffer the same size as for files to maximize throughput
func filterSize(minimum, maximum int64, in <-chan string) <-chan string {
    out := make(chan string, cap(in))
    go func() {
        for filename := range in {
            if minimum == -1 && maximum == -1 {
                out <- filename // don‘t do a stat call it not needed
                continue
            }
            finfo, err := os.Stat(filename)
            if err != nil {
                continue // ignore files we can‘t process
            }
            size := finfo.Size()
            if (minimum == -1 || minimum > -1 && minimum <= size) &&
                (maximum == -1 || maximum > -1 && maximum >= size) {
                out <- filename
            }
        }
        close(out)
    }()
    return out
}

func sink(in <-chan string) {
    for filename := range in {
        fmt.Println(filename)
    }
}

这段过滤是一个很简单大功能,设定一些参数就可以了。实现方式是类unix管道的方式,也就是串行。

首先使用了flag包把命令行参数解析出来,包括suffix,大小范围和文件名范围,然后依次建立了3个channel。

第一个channel到写端是把文件名列表解析成一个一个的文件名。

第二个channel的写端,是把第一个文件名按suffix做一次过滤后的结果。

第三个channel的写端,是把第二个的文件名按大小范围过滤后的结果。

最后一个sink读取第三个channel后,把结果打印出来。

嗯。。参数不同,有个分支只过滤了一次。。

关于flag包。。搜了下,解析参数时候是这样的:首先参数定义有两种,一种是带有-符号的一种是没有-符号的。flag的方法parse就是解析出来带有-符号的,flag的args方法就是获取其他参数的。好像就没啥别的太特别的了~

关于channel和goroutin,好像这儿没啥特别要说明的~

时间: 2024-08-02 11:04:25

《go语言程序设计》学习(八)的相关文章

C语言程序设计学习心得

一,思维导图 二,语法认识 1,if-else的用法 if (条件一) { 语句一; } else { 语句二; } 问题:else与if的匹配关系不明确,导致程序异常. 解决方法:牢记else与离其最近的一个if配对,不与其他的if连用,并规范代码书写格式,使其看起来跟加清晰明了. 2,while语句的用法 while (循环条件) { 循环语句; } 注意事项:while比较好用,基本上所有的循环结构都能用while写. 3,for语句的用法 for(表达式1; 表达式2; 表达式3) {

广东海洋大学 电子1151 孔yanfei python语言程序设计 第八周

六.包与模块 1.模块module Python中每一个.py脚本定义一个模块,所以我们可以在一个.py脚本中定义一个实现某个功能的函数或者脚本,这样其他的.py脚本就可以调用这个模块了.调用的方式有三种,如下: [python] view plain copy 在CODE上查看代码片派生到我的代码片 ################################### ## package and module #### ## a .py file define a module which

C语言程序设计第八次作业

一.学习内容     本次课学习了一维数组的基本知识,需要大家对如下知识点进行总结:     1. 数组的定义,数组元素的引用,数组的初始化和赋值.     2. 明确以下问题:能否给数组名赋值?为什么?C语言会对数组下标做越界检查吗?那么我们写程序时应该注意什么?     3. 对数组数据的访问一定是跟循环结构分不开的,一般情况下,循环变量的值随数组元素的下标变化.学会灵活运行循环结构完成对数组数据的处理.     4.通过火柴棍等式问题,理解利用函数.数组对程序的优化. 二.实验内容    

中国大学MOOC-翁恺-C语言程序设计习题集

Technorati 标签: 中国大学MOOC-翁恺-C语言程序设计习题集,C 今年网易出了"中国大学MOOC",于是选了浙大翁恺老师的"C语言程序设计"学习,近期打算把自己在该课程中的PAT习题解答做一个记录,等自己编程能力提高后再来看现在写的代码哪里还有写的不好,可以改进的地方,达到反思的目的.   中国大学MOOC-翁恺-C语言程序设计习题集,布布扣,bubuko.com

2018年秋季学期《c语言程序设计》学习总结

<c语言程序设计>第四周学习总结 <c语言程序设计>第五周学习总结 <c语言程序设计>第六周学习总结 <c语言程序设计>第七周学习总结 <c语言程序设计>第八周学习总结 <c语言程序设计>第九周学习总结 <c语言程序设计>第十周学习总结 <c语言程序设计>第十一周学习总结 <c语言程序设计>第十二周学习总结 <c语言程序设计>第十三周学习总结 原文地址:https://www.cnblo

初探swift语言的学习笔记八(保留了许多OC的实现)

尽管swift作为一门新语言,但还保留了许多OC的机制,使得swift和OC更好的融合在一起.如果没有OC基础的先GOOGLE一下. 如:KVO,DELEGATE,NOTIFICATION. 详见DEMO. import Foundation @objc // 需要打开objc标识,否则@optional编译出错 protocol kvoDemoDelegate { func willDoSomething() @optional func didDoSomething() //可选实现, }

C语言程序设计入门学习五步曲(转发)

笔者在从事教学的过程中,听到同学抱怨最多的一句话是:老师,上课我也能听懂,书上的例题也能看明白,可是到自己动手做编程时,却不知道如何下手.发生这种现象的原因有三个: 一.所谓的看懂听明白,只是很肤浅的语法知识,而我们编写的程序或软件是要根据要解决问题的实际需要控制程序的流程,如果你没有深刻地理解C语言的语句的执行过程(或流程),你怎么会编写程序解决这些实际问题呢? 二.用C语言编程解决实际问题,所需要的不仅仅是C语言的编程知识,还需要相关的专业知识.例如,如果你不知道长方形的面积公式,即使C语言

《go语言程序设计》学习(一)

序言 2年前的这个时候认识到了golang,然后兴匆匆的去书店买了本书,go语言,云动力吧好像是,结果拿过来一开始,环境就设置不上,折腾了几天,然后就不了了之了. 1年前的这个时候,再次路过书店,看到了<go语言程序设计>这本书,按耐不住心痒痒,又买回来,结果看了两章,又头昏脑胀,没坚持下去. 前几天看很多人都在讨论golang,我就又去把书翻出来了,这次决定要再前进一步,争取把书看完. (一个拖延症的懒癌患者的内心,是咆哮的) 一,示例代码:gobook已下载 二,开发环境:go 1.4,v

《C语言程序设计》课程教学目录

不要去精确定义单个论题,应将一整套问题组织成体系.--黎曼(1826-1866)德国著名数学家 教学过程 2018年秋季学期 C语言程序设计I-第一周教学 C语言程序设计I-第三周教学 C语言程序设计I-第四周教学 C语言程序设计I-第五周教学 C语言程序设计I-第六周教学 C语言程序设计I-第七周教学 C语言程序设计I-第八周教学 C语言程序设计I-第九周教学 C语言程序设计I-第十周教学 C语言程序设计I-第十一周教学 C语言程序设计I-第十二周教学 C语言程序设计I-第十三周教学 2019

C语言:C语言程序设计初步

.:.:第三章:c语言程序设计初步:.:. 第三章: C语言程序设计初步 C语言程序设计 本课介绍C语言程序设计的基本方法和基本的程序语句.从程序流程的角度来看,程序可以分为三种基本结构, 即顺序结构.分支结构.循环结构. 这三种基本结构可以组成所有的各种复杂程序.C语言提供了多种语句来实现这些程序结构. 本章介绍这些基本语句及其应用,使读者对C程序有一个初步的认识, 为后面各章的学习打下基础. C程序的语句 C程序的执行部分是由语句组成的. 程序的功能也是由执行语句实现的.C语句可分为以下五类