golang递归读取file a year ago
需求分析:读取$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次, 看看结果:
- 上一篇: 工序篇
- 下一篇: styled-components