前言
--
自古编程界流传着这样一个传说,十万行代码堆出一个程序大牛,所以我们很多小白们都奋斗在敲代码的路上,那么我们究竟离那十万行代码还差多远呢?!
这个程序的灵感就来源于此。我们将用golang实现出你离十万行代码的距离!
分析
--
此程序的关键在于能够深度挖掘目录中的所有.go文件,发现.go文件则读取文件中的行数,若是文件夹,则重复调用函数,形成递归函数,就像linux系统中删除带有内容的文件夹需要用到-r一样,使用递归处理这样的问题最为方便直接,下面让我们进入代码仔细分析!
代码
--
```go
package main
import (
"fmt"
"os"
"log"
"strings"
"bufio"
)
func countline(url string) {
fmt.Println("代码读取完毕")
fp,err:=os.Open(url)
//打开.go文件
if err!=nil {
log.Fatal(err)
}
defer fp.Close()
//使用bufio包下的newscannner方法来数行
input:=bufio.NewScanner(fp)
for input.Scan(){
//每多一行则全局变量a加一
a++
}
}
func findgo(url string) {
dp,err:=os.OpenFile(url,os.O_RDONLY,os.ModeDir)
//打开根目录,并扫描其中所有文件
if err!=nil {
log.Fatal(err)
return
}
defer dp.Close()
fileinfo,err:=dp.Readdir(-1)
if err!=nil {
log.Fatal(err)
return
}
for _,info:=range fileinfo{
//遍历所有文件,若是文件夹,则将此文件夹目录作为参数,重复调用此函数
if info.IsDir() {
findgo(url+"/"+info.Name())
}else if strings.HasSuffix(info.Name(),".go") {
//若是.go文件,则调用数行countline函数
countline(url+"/"+info.Name())
}
}
}
var a int=0
func main() {
var url string
fmt.Println("请输入您go代码所在根目录:")
fmt.Scan(&url)
//此函数用于寻找用户提供的目录下的所有.go文件
findgo(url)
score:=float32(a)/100000.0*100.0
//结束后进行人性化输出
fmt.Printf("您已经敲了%d行代码\n十万行代码的目标已经完成%.2f%%了,继续努力哦!!!",a,score)
}
```
最后
--
程序并不难,只是一个很有意思的小程序,大家不妨试试看,看看自己离十万行代码的目标还差多少。(大牛请自动忽略)
第 1 条附言 ·
感兴趣的朋友可以关注我的CSDN,还有很多分享,一起学go
https://blog.csdn.net/weixin_42940826
<a href="/user/SugarAYuan" title="@SugarAYuan">@SugarAYuan</a> 额 你这个问题难住我了,我的外部包一般放在github文件夹下的,或许可以加一段代码,遇到github名的文件夹直接跳过。
#5