你離十萬行程式碼還差多遠?(程式實現)
阿新 • • 發佈:2018-11-17
前言
自古程式設計界流傳著這樣一個傳說,十萬行程式碼堆出一個程式大牛,所以我們很多小白們都奮鬥在敲程式碼的路上,那麼我們究竟離那十萬行程式碼還差多遠呢?!
這個程式的靈感就來源於此。我們將用golang實現出你離十萬行程式碼的距離!
分析
此程式的關鍵在於能夠深度挖掘目錄中的所有.go檔案,發現.go檔案則讀取檔案中的行數,若是資料夾,則重複呼叫函式,形成遞迴函式,就像linux系統中刪除帶有內容的資料夾需要用到-r一樣,使用遞迴處理這樣的問題最為方便直接,下面讓我們進入程式碼仔細分析!
程式碼
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)
}
最後
程式並不難,只是一個很有意思的小程式,大家不妨試試看,看看自己離十萬行程式碼的目標還差多少。(大牛請自動忽略)