-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
122 lines (100 loc) · 1.89 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package main
import (
"bufio"
"flag"
"fmt"
"io/fs"
"os"
"path/filepath"
"strings"
"sync"
)
func counting(filename string) int {
f, err := os.Open(filename)
if err != nil {
fmt.Fprintf(os.Stderr, "counting(): %v\n", err)
return 0
}
defer f.Close()
scanner := bufio.NewScanner(f)
scanner.Split(bufio.ScanLines)
var count int
for scanner.Scan() {
count++
}
if err := scanner.Err(); err != nil {
fmt.Fprintf(os.Stderr, "counting(): %v\n", err)
return 0
}
return count
}
func dirents(dir string) []fs.DirEntry {
entries, err := os.ReadDir(dir)
if err != nil {
fmt.Fprintf(os.Stderr, "dirents: %v\n", err)
return nil
}
return entries
}
func walkDir(dir string, n *sync.WaitGroup, count chan<- int) {
defer n.Done()
entrys := dirents(dir)
for _, e := range entrys {
if e.IsDir() {
n.Add(1)
subDir := filepath.Join(dir, e.Name())
go walkDir(subDir, n, count)
continue
}
if isSelected(e.Name()) {
filename := filepath.Join(dir, e.Name())
count <- counting(filename)
}
}
}
func isSelected(name string) bool {
suffix := getSuffix(*fileType)
if filepath.Ext(name) != suffix {
return false
}
name = strings.TrimSuffix(name, suffix)
if *noTesting {
cuts := strings.Split(name, "_")
if cuts[len(cuts)-1] == "test" {
return false
}
}
return true
}
func getSuffix(fileType string) string {
switch fileType {
case "go":
return ".go"
case "c":
return ".c"
default:
return ".go"
}
}
func start() int {
count := make(chan int)
var n sync.WaitGroup
n.Add(1)
go walkDir(`./`, &n, count)
go func() {
n.Wait()
defer close(count)
}()
var numlines int
for c := range count {
numlines += c
}
return numlines
}
var fileType = flag.String("f", "go", "默认为go语言")
var noTesting = flag.Bool("t", false, "默认包含测试文件")
func main() {
flag.Parse()
numlines := start()
fmt.Printf("一共%d行代码\n", numlines)
}