心愿 2023 能够听到这些话:
- 祝贺你失去了这份工作
- 祝贺你的倡议被采纳了
- 祝贺你被录取了
- 祝贺你的考试顺利通过了
- 祝贺你上岸了
- 祝贺你升职了
- 祝贺你加薪了
- 祝贺你体检后果一切正常
在这篇文章上面许个愿吧!
ls 命令
要实现 ls
,首先先咱们温习一下ls
命令。
ls
不加任何参数,示意查问当前目录下的文件 / 文件夹ls
前面加上门路,列出所有,不蕴含暗藏文件 / 文件夹ls -a
列出所有,包含以.
结尾的暗藏文件
此命令还有很多性能,这一节的重点是命令行水平的编写,就实现下面四个。
os.Args 读取参数
定义如下,一个数组。该数组长度由参数个数决定,第一个参数为程序自身,前面为参数列表。
var Args []string
比方ls -l
,Args=["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 folder
file1 file2
看,咱们曾经简略的实现了。但咱们会发现,要应用 -
结尾的参数时,用 os.Args
这个还须要手写更多简单逻辑去判断输出的到底是门路,还是其余参数,于是下一个包退场了。
pflag
昨天的每日一 Go
曾经讲了 flag
包,pflag
包与 flag
包的工作原理甚至是代码实现都是相似的,上面是 pflag
绝对 flag
的一些劣势:
- 反对更加精密的参数类型:例如,
flag
只反对uint
和uint64
,而pflag
额定反对uint8
、uint16
、int32
等类型。 - 反对更多参数类型:
ip
、ip mask
、ip net
、count
、以及所有类型的slice
类型。 - 兼容规范
flag
库的Flag
和FlagSet
:pflag
更像是对flag
的扩大。 - 原生反对更丰盛的性能:反对
shorthand
、deprecated
、hidden
等高级性能。
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
$ ./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.
是不是相当给力啦!
小结
命令行读取一共有五个罕用的包
os.Args
零碎包提供的参数解析。flag
:简略参数解析,昨天的每日一Go
分享过。pflag
:命令行参数解析。cobra
:利用命令行框架,改天再分享。viper
:配置文件、环境变量、命令行、缓冲区。明天群里的每日一 Go 曾经分享了,就不多说了。
命令行工具,你只有赋予可执行权限,再放到 bin
外面,他就会成为一个系统命令,不便你做更多的事件,比方备份数据库之类的动作,进步你的运维效率。
援用
- 命令行工具
- 极客工夫
本文由 mdnice 多平台公布