日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

go errgroup 递归搜索目录中的Go文件

發(fā)布時間:2024/2/28 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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() }

我創(chuàng)建了一個context.Context并且為它添加了超時設置,當超時時間到了,”ctx”將接收到channel的超時警告。WithTimeout同樣也會返回一個取消的方法,但是我們不需要,所以用 “_” 來忽略掉了。?
下面的search() 方法的有context,search path,和 search pattern。最后把找到的文件和數量輸出

總結

以上是生活随笔為你收集整理的go errgroup 递归搜索目录中的Go文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。