go各种有用的官方包

72 阅读3分钟

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

基本使用:

  • 定义选项结构,在结构标签中设置选项信息。通过shortlong设置短、长选项名字,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)

strings