// go run v4.go -- $PWD // GORACE="log_path=/tmp/v4.race_log" go run -race v4.go -- /usr/bin // http://golang.org/doc/articles/race_detector.html package main import ( "bufio" "flag" "fmt" "os" "path/filepath" "sync" ) // START global OMIT var ( globalLineCount int wg sync.WaitGroup // HLwg ) // END global OMIT func lineCount(path string) (int, error) { f, err := os.Open(path) if err != nil { return 0, err } defer f.Close() r := bufio.NewReader(f) var lc int for err == nil { _, err = r.ReadString('\n') if err == nil { lc++ } } return lc, nil } func visit(path string, fi os.FileInfo, err error) error { if err != nil { return err } if !fi.Mode().IsRegular() { return nil } // START visit OMIT wg.Add(1) // HLwg go func() { lc, err := lineCount(path) if err != nil { fmt.Errorf("%s", err) } globalLineCount += lc // HL50 fmt.Printf("%d\t%s\n", lc, path) wg.Done() // HLwg }() // END visit OMIT return nil } func main() { flag.Parse() root := flag.Arg(0) err := filepath.Walk(root, visit) if err != nil { fmt.Errorf("%s", err) os.Exit(1) } // START main OMIT wg.Wait() // HLwg fmt.Printf("%d\ttotal\n", globalLineCount) // END main OMIT }