linux代码行数统计工具,统计代码行数工具 用golang实现

首先:修改conf文件,配置要查找什么后缀的文件代码行数

使用方法:countcodeliine filename or nothing(计算可执行程序所在目录)

实现功能:

1,统计代码行数

2,可以根据配置文件(conf)来进行设置要对什么类型的代码进行统计

3,统计每个类型文件行数,和总行数

将来要实现功能:

1,注释行数

2,注释率

3,导出csv功能

源代码:

package main

import(

"os"

"container/list"

"io"

"log"

"path/filepath"

"bufio"

)

func init(){

log.SetFlags(log.Llongfile| log.LstdFlags)

}

func main(){

conf,err := ParseConf()

if nil != err{

log.Println(err)

return

}

allFiles := GetAllFilesName()

srcList := GetParsedFilesByConf(allFiles,conf)

res := Parse(srcList)

total := 0

for k,v := range res{

total += v

println(k,":",v)

}

println("Total: ",total)

}

//example:map["go" or "css"]123

func Parse(files list.List)(parseResult map[string]int){

parseResult = map[string]int{}

for e := files.Front(); nil != e; e = e.Next(){

v := e.Value.(string)

ext := filepath.Ext(v)

parseResult[ext] += ComputeLine(v)

}

return

}

func ComputeLine(path string)(num int){

f,err := os.Open(path)

if nil != err{

log.Println(err)

return

}

defer f.Close()

r := bufio.NewReader(f)

for{

_,err := r.ReadString('\n')

if io.EOF == err || nil != err{

break

}

num += 1

}

return

}

func ParseConf()(conf []string,err error){

confPath,_ := os.Getwd()

confPath += "/conf"

file,err := os.Open(confPath)

if nil != err{

log.Println(err)

return

}

defer file.Close()

scanner := bufio.NewScanner(file)

for scanner.Scan(){

conf = append(conf,scanner.Text())

}

//log.Println(conf)

return

}

func GetSrcFullPath()(fullPath string){

args := os.Args;

parameterLen := len(args)

if parameterLen == 1{

fullPath,_ = os.Getwd()

}else if(parameterLen >= 2){

fullPath = args[1]

}

fullPath,_ = filepath.Abs(fullPath)

return

}

func GetParsedFilesByConf(lst list.List,conf []string)(l list.List){

for e := lst.Front(); nil != e; e = e.Next(){

ext := filepath.Ext(e.Value.(string))

for _,extension := range conf{

if ext == extension{

l.PushBack(e.Value.(string))

continue

}

}

}

for e := l.Front(); nil != e; e = e.Next(){

println("matched string:",e.Value.(string))

}

return

}

func GetAllFilesName() (lst list.List){

fullPath := GetSrcFullPath()

filepath.Walk(fullPath,func(path string,fi os.FileInfo,err error)error{

if nil == fi {

return err

}

if fi.IsDir() {

return nil

}

//println(fi.Name())

//println(path)

//name := fi.Name()

lst.PushBack(path)

return nil

})

return

}

rd := bufio.NewReader(file)

var line string

for{

line,err = rd.ReadString('\n')

if io.EOF == err{

err = nil

break

}else if nil != err{

break

}

conf = append(conf,line[:len(line)-1])

}ReadString('\n')只能在linux上可以运行,因为windwos换行符是\r\n,linux是\n,所以换成用Scan来实现,但是Scan是go1.1

新增的struct,大家使用时请务必注意升级go。

conf配置文件:

.go

.html

.css

.js

github地址:

欢迎大家随便修改。

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值