您的位置:首页 > 编程语言

Golang 计算目录中代码的行数

2015-05-29 13:18 330 查看

程序名字

countline

os 包来获取运行参数

运行的时候要提供两个参数,一个是目录,一个是扩展名

如:

countline . go


没有运行参数的就退出程序

if len(os.Args) != 3 {
fmt.Println("countline [Dir] [extention]")
return
}


计算文件有多少个 ‘\n’

func countFileLine(name string) (count int64, err error) {
fmt.Println("count file:", name)
data, err := ioutil.ReadFile(name)
if err != nil {
return
}
count = 0
for i := 0; i < len(data); i++ {
if data[i] == '\n' {
count++
}
}
fmt.Println("line:", count)
return
}


遍历目录

filepath.Walk(os.Args[1], func(path string, info os.FileInfo, err error) error {
if getExt(path) == os.Args[2] {
fmt.Println(path)
n, e := countFileLine(path)
if e == nil {
fmt.Println("lines: ", n)
sum = sum + n
}
}
return nil
})


filepath.Walk会第二个成员是一个函数,其中的path就是遍历得到的文件路径,经过判断它是一个文件,就直接读出来。

完整代码:

package main

import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
"strings"
)

var (
sum int64
)

func main() {
if len(os.Args) != 3 {
fmt.Println("countline [Dir] [extention]")
return
}
filepath.Walk(os.Args[1], func(path string, info os.FileInfo, err error) error {
if getExt(path) == os.Args[2] {
fmt.Println(path)
n, e := countFileLine(path)
if e == nil {
fmt.Println("lines: ", n)
sum = sum + n
}
}
return nil
})
fmt.Println("total lines: ", sum)
}

//获取得文件的扩展名,最后一个.后面的内容
func getExt(f string) (ext string) {
// fmt.Println("ext:", f)
index := strings.LastIndex(f, ".")
data := []byte(f)
for i := index + 1; i < len(data); i++ {
ext = ext + string([]byte{data[i]})
}
return
}

func countFileLine(name string) (count int64, err error) { fmt.Println("count file:", name) data, err := ioutil.ReadFile(name) if err != nil { return } count = 0 for i := 0; i < len(data); i++ { if data[i] == '\n' { count++ } } fmt.Println("line:", count) return }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: