心愿2023能够听到这些话:

  • 祝贺你失去了这份工作
  • 祝贺你的倡议被采纳了
  • 祝贺你被录取了
  • 祝贺你的考试顺利通过了
  • 祝贺你上岸了
  • 祝贺你升职了
  • 祝贺你加薪了
  • 祝贺你体检后果一切正常

在这篇文章上面许个愿吧!

ls 命令

要实现ls,首先先咱们温习一下ls命令。

  • ls不加任何参数,示意查问当前目录下的文件/文件夹
  • ls前面加上门路,列出所有,不蕴含暗藏文件/文件夹
  • ls -a列出所有,包含以.结尾的暗藏文件

此命令还有很多性能,这一节的重点是命令行水平的编写,就实现下面四个。

os.Args 读取参数

定义如下,一个数组。该数组长度由参数个数决定,第一个参数为程序自身,前面为参数列表。

var Args []string

比方ls -lArgs=["ls","-l"],咱们当初实现ls+目录,或者缺省目录时默认当前目录代码如下。

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 来获取传入程序的参数
  • 应用 ioutil.ReadDir 读取目录,将返回值[] FileInfo遍历,输入目录/文件信息
  • 将遇到的error输入到 终端

输入

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

看,咱们曾经简略的实现了。但咱们会发现,要应用-结尾的参数时,用os.Args这个还须要手写更多简单逻辑去判断输出的到底是门路,还是其余参数,于是下一个包退场了。

pflag

昨天的每日一Go曾经讲了flag包,pflag 包与 flag 包的工作原理甚至是代码实现都是相似的,上面是 pflag 绝对 flag 的一些劣势:

  • 反对更加精密的参数类型:例如,flag 只反对 uintuint64,而 pflag 额定反对 uint8uint16int32 等类型。
  • 反对更多参数类型:ipip maskip netcount、以及所有类型的 slice 类型。
  • 兼容规范 flag 库的 FlagFlagSetpflag 更像是对 flag 的扩大。
  • 原生反对更丰盛的性能:反对 shorthanddeprecatedhidden 等高级性能。
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函数里,第二参数是一个bool判断是否列出全副文件(包含暗藏文件)感兴趣去看我源代码,这里不是重点。
  • pflag.BoolP 定义一个bool类型的参数,反对长短参数模式--all,-a,返回值是指针。
  • pflag.Parse() 调用这个函数,把参数值设置到相应指针的指向里。
  • pflag.Usage() 用法打印。

这样咱们就实现了ls的基本功能。测试一下。

$ go build -o ls main.go$ ./lsfolder 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 -hUsage of ./ls:  -a, --all    Include directory entries whose names begin with a dot (.).  -h, --help   Show this help message.

是不是相当给力啦!

小结

命令行读取一共有五个罕用的包

  • os.Args 零碎包提供的参数解析。
  • flag:简略参数解析,昨天的每日一Go分享过。
  • pflag:命令行参数解析。
  • cobra:利用命令行框架,改天再分享。
  • viper:配置文件、环境变量、命令行、缓冲区。明天群里的每日一Go曾经分享了,就不多说了。

命令行工具,你只有赋予可执行权限,再放到bin外面,他就会成为一个系统命令,不便你做更多的事件,比方备份数据库之类的动作,进步你的运维效率。

援用

  • 命令行工具
  • 极客工夫

本文由mdnice多平台公布