欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

通過(guò)Golang實(shí)現(xiàn)linux命令ls命令(命令行工具構(gòu)建)

 更新時(shí)間:2023年01月13日 15:07:40   作者:機(jī)智的程序員小熊  
這篇文章主要為大家詳細(xì)介紹了如何通過(guò)Golang實(shí)現(xiàn)一個(gè)linux命令ls命令(命令行工具構(gòu)建),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下

ls 命令

要實(shí)現(xiàn)ls,首先先我們復(fù)習(xí)一下ls命令。

  • ls不加任何參數(shù),表示查詢當(dāng)前目錄下的文件/文件夾
  • ls后面加上路徑,列出所有,不包含隱藏文件/文件夾
  • ls -a列出所有,包括以.開頭的隱藏文件

此命令還有很多功能,這一節(jié)的重點(diǎn)是命令行程度的編寫,就實(shí)現(xiàn)上面四個(gè)。

os.Args 讀取參數(shù)

定義如下,一個(gè)數(shù)組。該數(shù)組長(zhǎng)度由參數(shù)個(gè)數(shù)決定,第一個(gè)參數(shù)為程序本身,后面為參數(shù)列表。

var Args []string

比如ls -l,Args=["ls","-l"],我們現(xiàn)在實(shí)現(xiàn)ls+目錄,或者缺省目錄時(shí)默認(rèn)當(dāng)前目錄代碼如下。

func main() {
	targetDirPath := "./"
	if len(os.Args) > 1 {
		targetDirPath = os.Args[1]
	}

	if dirList, err := ioutil.ReadDir(targetDirPath); err == nil {
		for _, dirInfo := range dirList {
			fmt.Print(dirInfo.Name() + " ")
		}
	} else {
		fmt.Println(err.Error())
	}
}
  • 使用 os.Agrs 來(lái)獲取傳入程序的參數(shù)
  • 使用 ioutil.ReadDir 讀取目錄,將返回值[] FileInfo遍歷,輸出目錄/文件信息
  • 將遇到的error輸出到 終端

輸出

$ go build -o ls main.go
$ ./ls 
main.go folder ls
$ ./ls folder
file1 file2

看,我們已經(jīng)簡(jiǎn)單的實(shí)現(xiàn)了。但我們會(huì)發(fā)現(xiàn),要使用-開頭的參數(shù)時(shí),用os.Args這個(gè)還需要手寫更多復(fù)雜邏輯去判斷輸入的到底是路徑,還是其他參數(shù),于是下一個(gè)包登場(chǎng)了。

pflag

昨天的每日一Go已經(jīng)講了flag包,pflag 包與 flag 包的工作原理甚至是代碼實(shí)現(xiàn)都是類似的,下面是 pflag 相對(duì) flag 的一些優(yōu)勢(shì):

  • 支持更加精細(xì)的參數(shù)類型:例如,flag 只支持 uintuint64,而 pflag 額外支持 uint8、uint16、int32 等類型。
  • 支持更多參數(shù)類型:ipip mask、ip net、count、以及所有類型的 slice 類型。
  • 兼容標(biāo)準(zhǔn) flag 庫(kù)的 FlagFlagSetpflag 更像是對(duì) flag 的擴(kuò)展。
  • 原生支持更豐富的功能:支持 shorthand、deprecated、hidden 等高級(jí)功能。
var a = pflag.BoolP("all", "a", false, "Include directory entries whose names begin with a dot (.).")
	var help = pflag.BoolP("help", "h", false, "Show this help message.")
	pflag.Parse()
	if *help {
		pflag.Usage()
		return
	}
	args := pflag.Args()
	if len(args) == 0 {
		args = append(args, "./")
	}
	if len(args) == 1 {
		ShowPath(args[0], *a)
	} else {
		for _, v := range args {
			fmt.Println(v + ":")
			ShowPath(v, *a)
		}
	}
  • 列出文件夾的方式寫到了ShowPath函數(shù)里,第二參數(shù)是一個(gè)bool判斷是否列出全部文件(包括隱藏文件)感興趣去看我源代碼,這里不是重點(diǎn)。
  • pflag.BoolP 定義一個(gè)bool類型的參數(shù),支持長(zhǎng)短參數(shù)形式--all,-a,返回值是指針。
  • pflag.Parse() 調(diào)用這個(gè)函數(shù),把參數(shù)值設(shè)置到相應(yīng)指針的指向里。
  • pflag.Usage() 用法打印。

這樣我們就實(shí)現(xiàn)了ls的基本功能。測(cè)試一下。

$ go build -o ls main.go
$ ./ls
folder go.mod go.sum main.go 
$ ./ls -a
. .. .git folder go.mod go.sum main.go 
$ ./ls ./ folder 
./:
folder go.mod go.sum main.go 
folder:
file1 file2
$ ./ls -h
Usage of ./ls:
  -a, --all    Include directory entries whose names begin with a dot (.).
  -h, --help   Show this help message.

是不是相當(dāng)給力啦!

小結(jié)

命令行讀取一共有五個(gè)常用的包

  • os.Args 系統(tǒng)包提供的參數(shù)解析。
  • flag:簡(jiǎn)單參數(shù)解析,昨天的每日一Go分享過(guò)。
  • pflag:命令行參數(shù)解析。
  • cobra:應(yīng)用命令行框架,改天再分享。
  • viper:配置文件、環(huán)境變量、命令行、緩沖區(qū)。今天群里的每日一Go已經(jīng)分享了,就不多說(shuō)了。

命令行工具,你只要賦予可執(zhí)行權(quán)限,再放到bin里面,他就會(huì)成為一個(gè)系統(tǒng)命令,方便你做更多的事情,比如備份數(shù)據(jù)庫(kù)之類的動(dòng)作,提高你的運(yùn)維效率。 哦對(duì)了源碼在這:https://github.com/golang-minibear2333/cmd_utils

以上就是通過(guò)Golang實(shí)現(xiàn)linux命令ls命令(命令行工具構(gòu)建)的詳細(xì)內(nèi)容,更多關(guān)于Golang命令行工具的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Golang之sync.Pool對(duì)象池對(duì)象重用機(jī)制總結(jié)

    Golang之sync.Pool對(duì)象池對(duì)象重用機(jī)制總結(jié)

    這篇文章主要對(duì)Golang的sync.Pool對(duì)象池對(duì)象重用機(jī)制做了一個(gè)總結(jié),文中有相關(guān)的代碼示例和圖解,具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-07-07
  • go string to int 字符串與整數(shù)型的互換方式

    go string to int 字符串與整數(shù)型的互換方式

    這篇文章主要介紹了go string to int 字符串與整數(shù)型的互換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Go語(yǔ)言實(shí)現(xiàn)運(yùn)算符重載的方法詳解

    Go語(yǔ)言實(shí)現(xiàn)運(yùn)算符重載的方法詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用Go語(yǔ)言實(shí)現(xiàn)運(yùn)算符重載的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-09-09
  • 簡(jiǎn)單聊聊Golang中defer預(yù)計(jì)算參數(shù)

    簡(jiǎn)單聊聊Golang中defer預(yù)計(jì)算參數(shù)

    在golang當(dāng)中defer代碼塊會(huì)在函數(shù)調(diào)用鏈表中增加一個(gè)函數(shù)調(diào)用,下面這篇文章主要給大家介紹了關(guān)于Golang中defer預(yù)計(jì)算參數(shù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • Go語(yǔ)言中內(nèi)存管理逃逸分析詳解

    Go語(yǔ)言中內(nèi)存管理逃逸分析詳解

    所謂的逃逸分析(Escape?analysis)是指由編譯器決定內(nèi)存分配的位置嗎不需要程序員指定。本文就來(lái)和大家簡(jiǎn)單分析一下Go語(yǔ)言中內(nèi)存管理逃逸吧
    2023-03-03
  • 使用?gomonkey?Mock?函數(shù)及方法示例詳解

    使用?gomonkey?Mock?函數(shù)及方法示例詳解

    在 Golang 語(yǔ)言中,寫單元測(cè)試的時(shí)候,不可避免的會(huì)涉及到對(duì)其他函數(shù)及方法的 Mock,即在假設(shè)其他函數(shù)及方法響應(yīng)預(yù)期結(jié)果的同時(shí),校驗(yàn)被測(cè)函數(shù)的響應(yīng)是否符合預(yù)期,這篇文章主要介紹了使用?gomonkey?Mock?函數(shù)及方法,需要的朋友可以參考下
    2022-06-06
  • go語(yǔ)言中for?range使用方法及避坑指南

    go語(yǔ)言中for?range使用方法及避坑指南

    Go中的for range組合可以和方便的實(shí)現(xiàn)對(duì)一個(gè)數(shù)組或切片進(jìn)行遍歷,但是在某些情況下使用for range時(shí)很可能就會(huì)被"坑",下面這篇文章主要給大家介紹了關(guān)于go語(yǔ)言中for?range使用方法及避坑指南的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • Golang橋接模式講解和代碼示例

    Golang橋接模式講解和代碼示例

    橋接是一種結(jié)構(gòu)型設(shè)計(jì)模式,可將業(yè)務(wù)邏輯或一個(gè)大類拆分為不同的層次結(jié)構(gòu),從而能獨(dú)立地進(jìn)行開發(fā),本文將通過(guò)代碼示例詳細(xì)給大家介紹一下Golang橋接模式,需要的朋友可以參考下
    2023-06-06
  • Go?語(yǔ)言前綴樹實(shí)現(xiàn)敏感詞檢測(cè)

    Go?語(yǔ)言前綴樹實(shí)現(xiàn)敏感詞檢測(cè)

    這篇文章主要為大家介紹了Go語(yǔ)言前綴樹實(shí)現(xiàn)敏感詞檢測(cè)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Golang實(shí)現(xiàn)密碼加密的示例詳解

    Golang實(shí)現(xiàn)密碼加密的示例詳解

    數(shù)據(jù)庫(kù)在存儲(chǔ)密碼時(shí),不能明文存儲(chǔ),需要加密后存儲(chǔ),而Golang中的加密算法有很多種,下面小編就來(lái)通過(guò)簡(jiǎn)單的示例和大家簡(jiǎn)單聊聊吧
    2023-07-07

最新評(píng)論