最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

通過(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列出所有,包括以.開(kāi)頭的隱藏文件

此命令還有很多功能,這一節(jié)的重點(diǎn)是命令行程度的編寫(xiě),就實(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),要使用-開(kāi)頭的參數(shù)時(shí),用os.Args這個(gè)還需要手寫(xiě)更多復(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、uint16int32 等類型。
  • 支持更多參數(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)
		}
	}
  • 列出文件夾的方式寫(xiě)到了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詳解

    深入Golang中的sync.Pool詳解

    這篇文章主要介紹了深入Golang中的sync.Pool詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • Go 語(yǔ)言json.Unmarshal 遇到的小問(wèn)題(推薦)

    Go 語(yǔ)言json.Unmarshal 遇到的小問(wèn)題(推薦)

    這篇文章主要介紹了 Go 語(yǔ)言json.Unmarshal 遇到的小問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 一文帶你探索Go語(yǔ)言中crypto/md5標(biāo)準(zhǔn)庫(kù)的強(qiáng)大功能

    一文帶你探索Go語(yǔ)言中crypto/md5標(biāo)準(zhǔn)庫(kù)的強(qiáng)大功能

    我們將從MD5算法的基礎(chǔ)知識(shí)入手,逐步深入到如何在Go中有效使用crypto/md5標(biāo)準(zhǔn)庫(kù),包括基本的使用方法、實(shí)際應(yīng)用案例分析,以及性能和安全性的考量,需要的可以參考下
    2024-02-02
  • Golang正整數(shù)指定規(guī)則排序算法問(wèn)題分析

    Golang正整數(shù)指定規(guī)則排序算法問(wèn)題分析

    這篇文章主要介紹了Golang正整數(shù)指定規(guī)則排序算法問(wèn)題,結(jié)合實(shí)例形式分析了Go語(yǔ)言排序算法操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2017-01-01
  • 詳解Golang time包中的time.Duration類型

    詳解Golang time包中的time.Duration類型

    在日常開(kāi)發(fā)過(guò)程中,會(huì)頻繁遇到對(duì)時(shí)間進(jìn)行操作的場(chǎng)景,使用 Golang 中的 time 包可以很方便地實(shí)現(xiàn)對(duì)時(shí)間的相關(guān)操作,本文講解一下 time 包中的 time.Duration 類型,需要的朋友可以參考下
    2023-07-07
  • go語(yǔ)言中HTTPRouter的算法演進(jìn)

    go語(yǔ)言中HTTPRouter的算法演進(jìn)

    這篇文章主要從開(kāi)發(fā)中常見(jiàn)的應(yīng)用場(chǎng)景?“路由管理”?為例,為大家詳細(xì)介紹一下三種常用的實(shí)現(xiàn)方案背后的數(shù)據(jù)結(jié)構(gòu)和算法,感興趣的小伙伴可以了解一下
    2023-08-08
  • go語(yǔ)言環(huán)境變量設(shè)置全過(guò)程

    go語(yǔ)言環(huán)境變量設(shè)置全過(guò)程

    這篇文章主要介紹了go語(yǔ)言環(huán)境變量設(shè)置全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Go語(yǔ)言中的通道channel詳情

    Go語(yǔ)言中的通道channel詳情

    這篇文章主要介紹了Go語(yǔ)言中的通道channel,在Go語(yǔ)言中管道類似于一個(gè)數(shù)據(jù)流,每次放入或者取出一部分?jǐn)?shù)據(jù),數(shù)據(jù)取出后原通道內(nèi)的數(shù)據(jù)就刪除掉,在linux操作系統(tǒng)中管道會(huì)將函數(shù)的返回結(jié)果作為下一個(gè)函數(shù)的參數(shù),下文詳細(xì)內(nèi)容需要的朋友可以參考下
    2022-02-02
  • Go爬蟲(chóng)(http、goquery和colly)詳解

    Go爬蟲(chóng)(http、goquery和colly)詳解

    goquery可以避免操作復(fù)雜的正則表達(dá)式,它可以直接根據(jù)url獲取一個(gè)Document對(duì)象,然后根據(jù)標(biāo)簽選擇器、類選擇器和id選擇器獲取相應(yīng)的選擇對(duì)象,進(jìn)行自定義的操作,這篇文章主要介紹了Go爬蟲(chóng)(http、goquery和colly),需要的朋友可以參考下
    2022-09-09
  • go中import包的大坑解決方案

    go中import包的大坑解決方案

    最近開(kāi)始使用Go/GoLand 在import 自定義包時(shí)出現(xiàn)各種狀況,本文就介紹一下go中import包的大坑解決方案,具有一定的參考價(jià)值,感興趣 可以了解一下
    2022-06-06

最新評(píng)論

顺平县| 乌兰浩特市| 周口市| 沁阳市| 南木林县| 娄底市| 白沙| 嘉义市| 华亭县| 阿拉善左旗| 福泉市| 青神县| 进贤县| 怀仁县| 新津县| 浮梁县| 武强县| 乌兰县| 龙海市| 贡嘎县| 长泰县| 广州市| 囊谦县| 临猗县| 广德县| 罗山县| 师宗县| 呼图壁县| 合川市| 延安市| 枝江市| 松潘县| 靖边县| 陇川县| 安顺市| 龙里县| 亚东县| 邵阳县| 信丰县| 根河市| 德格县|