go mod
go mod 常用指令
go mod init # 初始化go.mod
go mod tidy # 直接从源代码中获取依赖关系,更新依赖文件。可删掉go.mod中无用的依赖。
go mod download # 下载依赖文件
go mod vendor # 将依赖转移至本地的vendor文件
go mod edit # 手动修改依赖文件
go mod graph # 打印依赖图
go mod verify # 校验依赖
-
go get: 对go mod项目,添加,更新,删除go.mod文件的依赖项(仅源码)。不执行编译。侧重应用依赖项管理。- 参数介绍:
- -d 只下载不安装
- -f 只有在你包含了 -u 参数的时候才有效,不让 -u 去验证 import 中的每一个都已经获取了,这对于本地 fork 的包特别有用
- -fix 在获取源码之后先运行 fix,然后再去做其他的事情
- -t 同时也下载需要为运行测试所需要的包
- -u 强制使用网络去更新包和它的依赖包
- -v 显示执行的命令
-
go install: 在操作系统中安装Go 生态的第三方命令行应用。不更改项目go.mod文件。侧重可执行文件的编译和安装。
flags
下载:go get github.com/jessevdk/go-flags
基本使用:
- 定义选项结构,在结构标签中设置选项信息。通过
short和long设置短、长选项名字,description设置帮助信息。命令行传参时,短选项前加-,长选项前加--;default设置默认值;required设置是否必须
// 定义选项结构
type ApiOptions struct {
flags.Options
Environment string `short:"e" long:"env" description:"Use ApiServer environment" default:"testing"`
Version bool `short:"v" long:"verbose" description:"Show ApiServer version"`
EnablePProfile bool `short:"p" long:"enable-pprof" description:"enable pprof"`
PProfilePort int `short:"d" long:"pprof-port" description:"pprof port" required:"true" default:"8188"`
HealthCheckURI string `short:"i" long:"health-check-uri" description:"health check uri" default:"/health" `
HealthCheckPort int `short:"f" long:"health-check-port" description:"health check port" default:"8186"`
ConfigFileName string `short:"c" long:"config" description:"Use ApiServer config file" default:"main"`
}
func main() {
var opt ApiOption
flags.Parse(&opt)
fmt.Println(opt.Version) // 会打印出一个bool值
}
如果字段是基本类型的切片,基本解析流程与对应的基本类型是一样的。切片类型选项的不同之处在于,遇到相同的选项时,值会被追加到切片中。而非切片类型的选项,后出现的值会覆盖先出现的值。
Parse()和ParseArgs()的区别:
Parse()相当于调用ParseArgs(os.Args[1:])
分组使用
type Option struct {
Basic GroupBasicOption `description:"basic type" group:"basic"`
Slice GroupSliceOption `description:"slice of basic type" group:"slice"`
}
type GroupBasicOption struct {
IntFlag int `short:"i" long:"intflag" description:"int flag"`
BoolFlag bool `short:"b" long:"boolflag" description:"bool flag"`
FloatFlag float64 `short:"f" long:"floatflag" description:"float flag"`
StringFlag string `short:"s" long:"stringflag" description:"string flag"`
}
type GroupSliceOption struct {
IntSlice int `long:"intslice" description:"int slice"`
BoolSlice bool `long:"boolslice" description:"bool slice"`
FloatSlice float64 `long:"floatslice" description:"float slice"`
StringSlice string `long:"stringslice" description:"string slice"`
}
func main() {
var opt Option
p := flags.NewParser(&opt, flags.Default)
_, err := p.ParseArgs(os.Args[1:])
if err != nil {
log.Fatal("Parse error:", err)
}
basicGroup := p.Command.Group.Find("basic")
for _, option := range basicGroup.Options() {
fmt.Printf("name:%s value:%v\n", option.LongNameWithNamespace(), option.Value())
}
sliceGroup := p.Command.Group.Find("slice")
for _, option := range sliceGroup.Options() {
fmt.Printf("name:%s value:%v\n", option.LongNameWithNamespace(), option.Value())
}
}
子命令
type PrintCommand struct {
msg string `short:"m" long:"message" description:"message to print" default:"hello world"
}
// 子命令必须实现此方法
func (this *MathCommand) Execute(args []string) error {
fmt.println("print the message:", msg)
}
type Option struct {
Print PrintCommand `command:"print"`
}
func main() {
var opt Option
_, err := flags.Parse(&opt)
if err != nil {
log.Fatal(err)
}
}
os
- 查找环境变量 func LookupEnv(key string)(string, bool)