go errgroup 递归搜索目录中的Go文件
生活随笔
收集整理的這篇文章主要介紹了
go errgroup 递归搜索目录中的Go文件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
為了測試sync.ErrGroup的所有功能,我寫了一個小程序,用一個指定的模式遞歸搜索目錄中的Go文件。這有助于在Go源代碼樹中查找已使用已棄用或更新的包的實例。要測試sync.ErrGroup的所有功能,我還為應用程序添加了超時設置在功能。 如果達到時間限制,所有搜索和處理goroutine將被取消,程序將結束
?
當程序運行時,它會生成以下結果:
$ gogrep -timeout 1000ms . fmt gogrep.gohits如果你使用的參數不正確的話,你會看到下面的輸出
gogrep by Brian Ketelsen Flags: -timeout durationtimeout in milliseconds (default 500ms) Usage: gogrep [flags] path pattern代碼如下:
package main import ("bytes""flag""fmt""io/ioutil""log""os""path/filepath""strings""time""golang.org/x/net/context""golang.org/x/sync/errgroup" ) func main() {duration := flag.Duration("timeout", 500*time.Millisecond, "timeout in milliseconds")flag.Usage = func() {fmt.Printf("%s by Brian Ketelsen\n", os.Args[0])fmt.Println("Usage:")fmt.Printf(" gogrep [flags] path pattern \n")fmt.Println("Flags:")flag.PrintDefaults()}flag.Parse()if flag.NArg() != 2 {flag.Usage()os.Exit(-1)}path := flag.Arg(0)pattern := flag.Arg(1)ctx, _ := context.WithTimeout(context.Background(), *duration)m, err := search(ctx, path, pattern)if err != nil {log.Fatal(err)}for _, name := range m {fmt.Println(name)}fmt.Println(len(m), "hits") } func search(ctx context.Context, root string, pattern string) ([]string, error) {g, ctx := errgroup.WithContext(ctx)paths := make(chan string, 100)// get all the pathsg.Go(func() error {defer close(paths)return filepath.Walk(root, func(path string, info os.FileInfo, err error) error {if err != nil {return err}if !info.Mode().IsRegular() {return nil}if !info.IsDir() && !strings.HasSuffix(info.Name(), ".go") {return nil}select {case paths <- path:case <-ctx.Done():return ctx.Err()}return nil})})c := make(chan string, 100)for path := range paths {p := pathg.Go(func() error {data, err := ioutil.ReadFile(p)if err != nil {return err}if !bytes.Contains(data, []byte(pattern)) {return nil}select {case c <- p:case <-ctx.Done():return ctx.Err()}return nil})}go func() {g.Wait()close(c)}()var m []stringfor r := range c {m = append(m, r)}return m, g.Wait() }我創建了一個context.Context并且為它添加了超時設置,當超時時間到了,”ctx”將接收到channel的超時警告。WithTimeout同樣也會返回一個取消的方法,但是我們不需要,所以用 “_” 來忽略掉了。?
下面的search() 方法的有context,search path,和 search pattern。最后把找到的文件和數量輸出
總結
以上是生活随笔為你收集整理的go errgroup 递归搜索目录中的Go文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: go sync.WaitGroup源码分
- 下一篇: mysql 给列增加索引