统计源代码行数的工具(go语言版)

源代码:

 1 package main
 2 
 3 import (
 4     "bufio"
 5     "fmt"
 6     "os"
 7     "path/filepath"
 8     "strings"
 9 )
10 
11 // isJavaFile 检查文件是否为 Java 文件
12 func iSuffixFile(filename string,suffix string) bool {
13     return strings.HasSuffix(filename, suffix)
14 }
15 
16 // countLines 统计文件中非空白的行数
17 func countLines(filePath string) (int, error) {
18     file, err := os.Open(filePath)
19     if err != nil {
20         return 0, err
21     }
22     defer file.Close()
23 
24     scanner := bufio.NewScanner(file)
25     lineCount := 0
26 
27     for scanner.Scan() {
28         line := strings.TrimSpace(scanner.Text())
29         if line != "" {
30             lineCount++
31         }
32     }
33 
34     return lineCount, scanner.Err()
35 }
36 
37 func main() {
38     if len(os.Args) != 3 {
39         fmt.Println("用法: scLineCounter <目录路径>  <文件后缀>")
40         os.Exit(1)
41     }
42 
43     totalLines := 0
44     root := os.Args[1]
45     suffix := os.Args[2]
46 
47     walkFunc := func(path string, info os.FileInfo, err error) error {
48         if err != nil {
49             return err
50         }
51 
52         if !info.IsDir() && iSuffixFile(info.Name(),suffix) {
53             lines, err := countLines(path)
54             if err != nil {
55                 fmt.Fprintf(os.Stderr, "无法读取文件 %s: %v\n", path, err)
56                 return nil
57             }
58             totalLines += lines
59         }
60 
61         return nil
62     }
63 
64     err := filepath.Walk(root, walkFunc)
65     if err != nil {
66         fmt.Fprintf(os.Stderr, "遍历目录时出错: %v\n", err)
67         os.Exit(1)
68     }
69 
70     fmt.Printf("总计非空白代码行数: %d\n", totalLines)
71 }

 

编译

go build scLineCounter.go

 

用法: 

scLineCounter <目录路径>  <文件后缀>
scLineCounter D:\projects\java\api\trunk  java

 

posted @ 2025-06-24 10:31  nanahome  阅读(12)  评论(0)    收藏  举报