Git仓库:https://gitee.com/xiaoyinhui/golang-code/tree/develop/go-admin-demo/go-admin
在几个子命令中可以发现,我们平时都是用的 rootCmd.AddCommand(api.StartCmd)
这个命令启动服务器的
文件路径:cmd/api/server.go
- 持久性标记 PersistentFlags():表示这个标记不仅绑定在当前命令上,同时也绑定在了当前命令的子命令上。PersistentFlags可以被当前命令下的所有子命令使用
- Flags()返回适用于此命令的完整 FlagSet(在此处和所有父级声明的本地和持久性)。
- PersistentFlags()返回当前命令中专门设置的持久化标志集
- StringVarP() 就是将命令行的中给的对应的标记参数进行填充
给第一个参数进行赋值
name:命令行上显示的名称。 在命令行中使用的方式 例如:./go-admin xiaoyin --xiaoyin666 param888
shorthand:单字母缩写标记。 在命令行中使用的方式 例如:./go-admin xiaoyin -w param888 这里就是上面全名称缩写别名【注意只能是单个字母】
value:默认设定的值。 这个参数的用处就是如果在命令行中没有输入这个标记相关的命令 那么就将这个默认值赋值给第一个参数
usage:帮助说明里面的信息。 等同于上面 cobra.Command 中的 Short
go-admin server -c config/settings.dev.yml
命令的 go-admin server
这里就不做解释了,不清楚可以翻看上面的内容,这里要说的是后半段内容
下面的代码,什么时候执行,这个应该也不用过多的说明,不清楚可以网上查一下
func init() {
// 关于 PersistentFlags() 的说明可以参考 cmd/xiaoyin/xiaoyin.go 中的备注说明
// 设置服务器的配置文件
StartCmd.PersistentFlags().StringVarP(&configYml, "config", "c", "config/settings.yml", "Start server with provided configuration file")
// 启动服务是否检查API数据
StartCmd.PersistentFlags().BoolVarP(&apiCheck, "api", "a", false, "Start server with check api data")
// 注册路由 fixme 其他应用的路由,在本目录新建文件放在init方法
AppRouters = append(AppRouters, router.InitRouter)
}
后半段命令 -c config/settings.dev.yml
有没有觉得跟代码中的哪里有点相似
我们大胆的猜测一下,这两个 c
之间是否存在某种联系,既然已经开始怀起其中存在猫腻,当然是去了解一下
这个原始的内容我们不动,上面我们不是自己弄了一个示例嘛,可以去那里面随便造嘛,我就模仿着,在那边浅试了一下
这段内容我是写在 cmd/xiaoyin/xiaoyin.go
中的
func init() {
// 持久性标记 PersistentFlags():表示这个标记不仅绑定在当前命令上,同时也绑定在了当前命令的子命令上。PersistentFlags可以被当前命令下的所有子命令使用
// Flags()返回适用于此命令的完整 FlagSet(在此处和所有父级声明的本地和持久性)。
// PersistentFlags()返回当前命令中专门设置的持久化标志集
// StringVarP() 就是将命令行的中给的对应的标记参数进行填充
// 给第一个参数进行赋值
// name:命令行上显示的名称。 在命令行中使用的方式 例如:./go-admin xiaoyin --xiaoyin666 param888
// shorthand:单字母缩写标记。 在命令行中使用的方式 例如:./go-admin xiaoyin -w param888 这里就是上面全名称缩写别名【注意只能是单个字母】
// value:默认设定的值。 这个参数的用处就是如果在命令行中没有输入这个标记相关的命令 那么就将这个默认值赋值给第一个参数
// usage:帮助说明里面的信息。 等同于上面 cobra.Command 中的 Short
StartCmd.PersistentFlags().StringVarP(&flagsParam, "xiaoyin666", "w", "param666", "这个就是帮助说明里面的信息")
}
func run() error {
fmt.Println("这是 xiaoyin 的示例")
fmt.Println("FlagsParam=", flagsParam)
return nil
}
这个时候重新编译然后再执行一下我们这个命令
这套配方还熟悉吧,并不陌生,从这其中我们也知道了,flagsParam
这个是被重新赋值了,这个赋值的内容正式我们代码中写的 param666
如果这是单纯赋值,那就很迷,既然这样写了,肯定不是这种蜜汁操作的,不清楚我们就尝试嘛,上面的 c
下面命令使用的 -c
我这里设置的是 w
是不是要尝试一下,说着就来
PS D:\go-admin> ./go-admin xiaoyin -w
Error: flag needs an argument: 'w' in -w
错误:标志需要参数:-w中的“w”
提示很明确,需要我们给参数
PS D:\go-admin> ./go-admin xiaoyin -w xiaoyin001
这是 xiaoyin 的示例
FlagsParam= xiaoyin001
从这里我们是不是又可以发现,我们可以使用 go-admin xiaoyin -w 参数
将命令行中的参数赋值给 flagsParam
看到这里就发现这还是很有用的,我们就可以知道,服务器启动的时候 -c
后面是传入的参数,用于配置文件的选择
目前还有 name
、usage
不清楚是干啥用的,usage
这个就不多解释了,主要是这个 name
是干嘛的,有的同学可能有点懵了
既然不知道我们就尝试嘛,一样往命令行中输入嘛
PS D:\go-admin> ./go-admin xiaoyin --xiaoyin666 xiaoyin002
这是 xiaoyin 的示例
FlagsParam= xiaoyin002
看到这里是不是有种豁然开朗的感觉,我们可以理解 name
是我们身份证上面的名字 shorthand
是我们的外号(简称),我在使用命令的时候不管是直接用身份证的名字还是叫外号都是可以的
一点点笔记,以便以后翻阅。