旺仔小糖

golang递归读取file a year ago

go
并发
1099个字符
共有123人围观

需求分析:读取$GOPATH,看看下面有多少go文件?

思路:读取dir,会有2种产物 (dir + file). 我们只需编写2个function,一个处理dir,一个处理 file;简图如下:

package main

import (
	"io/ioutil"
	"log"
	"path"
	"time"
)

var (
	dir    = "/Users/scottxiong/go"
	chDir  = make(chan string)
	chFile = make(chan string)
	num    int
)

func main() {
	scan()
}

func scan() {
	t1 := time.Now()
	proceedDir(dir)

	for {
		select {
		case dir := <-chDir:
			proceedDir(dir)
		case file := <-chFile:
			proceedFile(file)
			num++
		case <-time.After(time.Second * 3):
			log.Println("success")
			log.Println(time.Since(t1))
			log.Printf("共扫描go文件:%d\n", num) //875568
			return
		}
	}
}

func proceedDir(dir string) {
	fls, _ := ioutil.ReadDir(dir)
	for _, v := range fls {
		name := v.Name()
		if name[0] == '.' || name[0] == '_' || name[0] == '$' || name[0] == '~' {
			continue
		}
		if v.IsDir() {
			go func() {
				chDir <- path.Join(dir, name)
			}()
		} else {
			go func() {
				chFile <- path.Join(dir, name)
			}()
		}
	}
}

func proceedFile(file string) {
	ext := path.Ext(file)
	if ext == ".go" {
		log.Println(file)
	}
}

运行2次, 看看结果: