Golang 计算目录中代码的行数

juxuny · · 5297 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

程序名字

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
}

有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:juxuny

查看原文:Golang 计算目录中代码的行数

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

5297 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传