7天玩转 Golang 标准库之 flag

简介: 7天玩转 Golang 标准库之 flag

在编写Golang命令行应用时,flag标准库无疑是一个很有价值的工具。它允许你以各种方式来定义和解析命令行参数。

基础示例:定义与解析参数

若想使用flag标准库,你必须首先定义你希望从命令行接收的参数。下面展示了几种常见的参数类型

package main

import (
  "flag"
  "fmt"
)

func main() {
   wordPtr := flag.String("word", "go", "a string")
   numbPtr := flag.Int("number", 42, "an int")
   boolPtr := flag.Bool("fork", false, "a bool")

   var strVar string
   flag.StringVar(&strVar, "strVar", "flag", "a string var")

   flag.Parse()

   fmt.Println("word:", *wordPtr)
   fmt.Println("number:", *numbPtr)
   fmt.Println("fork:", *boolPtr)
   fmt.Println("strVar:", strVar)
}

在这个例子中,我们先在flag中定义了三种不同类型的参数word, number, fork,并通过函数StringVar 方法定义了一个字符串参数strVar。然后通过 flag.Parse()解析参数值到定义的几个参数。

进阶使用:自定义参数类型

有时,你可能需要使用一种flag库内置以外的参数类型。在这种情况下,你可以创建自定义的参数类型。以下是自定义参数类型的一个例子:

package main

import (
  "flag"
  "fmt"
  "strings"
)

type ArrayValue []string

func (s *ArrayValue) String() string {
  return fmt.Sprintf("%v", *s)
}

func (s *ArrayValue) Set(value string) error {
  *s = strings.Split(value, ",")
  return nil
}

var myValue ArrayValue

func main() {
  flag.Var(&myValue, "myValue", "my value")

  flag.Parse()

  fmt.Println(myValue)
}

在这个示例中,我们自定义了一个类型ArrayValue,它实现了flag包中的Value接口(该接口定义了SetString两个方法)。然后,我们用flag.Var方法定义了一个名为myValue的参数,并在命令行中使用逗号分隔的列表来赋值。

使用flag库处理子命令

许多命令行应用程序将使用子命令来处理某些任务。例如,git命令行工具就包括commit, push等子命令。我们可以用FlagSet实现对子命令的支持。

package main

import (
    "flag"
    "fmt"
    "os"
)

func main() {
    addCommand := flag.NewFlagSet("add", flag.ExitOnError)
    addInputPtr := addCommand.String("name", "", "Name to add")

    listCommand := flag.NewFlagSet("list", flag.ExitOnError)

    if len(os.Args) < 2 {
        fmt.Println("expected 'add' or 'list' subcommands")
        os.Exit(1)
    }

    switch os.Args[1] {

    case "add":
        addCommand.Parse(os.Args[2:])
        fmt.Println("subcommand 'add'")
        fmt.Println("  name:", *addInputPtr)
    case "list":
        listCommand.Parse(os.Args[2:])
        fmt.Println("subcommand 'list'")
        fmt.Println("  list would print here.")
    }
}

在这个例子中,我们定义了两个子命令add和list。每一个子命令有他们独特的标志,和他们自己的标志处理逻辑。

结语

Golang的flag库是一款强大的工具,它无需任何额外安装就能支持创建功能丰富的命令行应用。掌握flag库的使用,对于深化Golang的掌握和提高开发效率将起到非常有利的推动作用。

相关文章
|
1月前
|
Unix Go
Golang语言标准库time之日期和时间相关函数
这篇文章是关于Go语言日期和时间处理的文章,介绍了如何使用Go标准库中的time包来处理日期和时间。
35 3
|
2月前
|
JSON Go API
一文搞懂 Golang 高性能日志库 - Zap
一文搞懂 Golang 高性能日志库 - Zap
72 2
|
2月前
|
存储 JSON Go
一文搞懂 Golang 高性能日志库 Zerolog
一文搞懂 Golang 高性能日志库 Zerolog
118 0
|
2月前
|
JSON Go 数据格式
[golang]标准库-json
[golang]标准库-json
|
4月前
|
SQL NoSQL Go
技术经验分享:Golang标准库:errors包应用
技术经验分享:Golang标准库:errors包应用
36 0
|
5月前
|
Go
Golang标准库sync的使用
Golang标准库sync的使用
49 2
|
5月前
|
存储 网络协议 Go
7天玩转 Golang 标准库之 http/net
7天玩转 Golang 标准库之 http/net
54 2
|
5月前
|
Shell Go API
7天玩转 Golang 标准库之 os
7天玩转 Golang 标准库之 os
43 1
|
5月前
|
Go 索引
7天玩转 Golang 标准库之 sort
7天玩转 Golang 标准库之 sort
32 1
|
5月前
|
运维 监控 Go
Golang深入浅出之-Go语言中的日志记录:log与logrus库
【4月更文挑战第27天】本文比较了Go语言中标准库`log`与第三方库`logrus`的日志功能。`log`简单但不支持日志级别配置和多样化格式,而`logrus`提供更丰富的功能,如日志级别控制、自定义格式和钩子。文章指出了使用`logrus`时可能遇到的问题,如全局logger滥用、日志级别设置不当和过度依赖字段,并给出了避免错误的建议,强调理解日志级别、合理利用结构化日志、模块化日志管理和定期审查日志配置的重要性。通过这些实践,开发者能提高应用监控和故障排查能力。
173 1