美文网首页
go包:flag 接收命令行参数

go包:flag 接收命令行参数

作者: 呦丶耍脾气 | 来源:发表于2023-03-25 11:20 被阅读0次

1.介绍

Go中,如果要接收命令行参数,需要使用 flag包进行解析。不同的参数类型可以通过不同的方法接收。

2.参数接受

2.1 接受方式

使用flag接收参数,可以由以下三种方式接受:

  • 方式一: flag.Type(name,defaultVal,desc)
  • 方式二: flag.TypeVar(&flagVar,name,defaultVal,desc)
  • 方式三: flag.Var(&flagVar,name,desc)
  • 方式四: flag.Args()
  • 方式五:flag.Arg(i)
字段 说明
flag.Type 这里的Type是个抽象的概念,不是具体函数名
name 代表输入参数名
defaultVal 默认值
desc 描述信息

2.2 注意事项

  • 上面接收方式一、二、三,都是最后调用flag.Parse(),而方式四和方式五是提前调用flag.Parse()
  • 方式一、二、三传参时,注意布尔类型,尽量设置成-flag=val,否则会影响后面的参数解析。
  • 方式四、五不能使用-flag=val这种格式传参。

3.flag.Type

3.1 代码

package main
import (
    "flag"
    "fmt"
)
var (
    // 接收字符串
    str =  flag.String("name","默认名","用户姓名")
    // 接收整型
    age = flag.Int("age",18,"用户年龄")
    // 接收布尔型
    smoking = flag.Bool("smoking",false,"是否吸烟")
)
func main()  {
    // 解析
    flag.Parse()
    fmt.Printf("str: %v\n",*str)
    fmt.Printf("age: %v\n",*age)
    fmt.Printf("smoking: %v\n",*smoking)
}

3.2 编译运行

# 编译
➜ go build main.go
# 运行(不传参数时)
➜ ./main                                  
str: 默认名
age: 18
smoking: false

# 运行(传参数时)
➜ /main -name 张三 -age 100 -smoking=true
str: 张三
age: 100
smoking: true

4.flag.TypeVar

4.1 代码

package main
import (
    "flag"
    "fmt"
)
// 先定义变量
var (
    name string
    age int
    smoking bool
    weight float64
)
func main()  {
    // 接收字符串
    flag.StringVar(&name,"name","默认名字","用户名")
    // 接收整型
    flag.IntVar(&age,"age",18,"用户年龄")
    // 接收布尔类型
    flag.BoolVar(&smoking,"smoking",false,"是否吸烟?")
    // 接收浮点型
    flag.Float64Var(&weight,"w",60.0,"体重")
    // 解析
    flag.Parse()
    fmt.Printf("姓名: %v\n",name)
    fmt.Printf("年龄: %v\n",age)
    fmt.Printf("是否吸烟?: %v\n",smoking)
    fmt.Printf("体重: %v\n",weight)
}

4.2 编译运行

# 编译
➜ go build main.go

# 运行(不传参数时)
➜  ./main                                  
姓名: 默认名字
年龄: 18
是否吸烟?: false
体重: 60
# 运行(传参数时)
➜ ./main -name 张三 -age 22 -smoking=true  -w=88.9
姓名: 张三
年龄: 22
是否吸烟?: true
体重: 88.9

4.3 细节

在传参数过程中,发现布尔型传参如果不设置=,会影响后面的参数接收,具体如下:

# 布尔型不设置 = (发现名字没有被接收)
➜  gin-use git:(dev) ✗ ./main -smoking true -name 哈哈                   
姓名: 默认名字
年龄: 18
是否吸烟?: true
体重: 60

# 布尔型设置 = 
➜  gin-use git:(dev) ✗ ./main -smoking=true -name 哈哈
姓名: 哈哈
年龄: 18
是否吸烟?: true
体重: 60

5.flag.Var

通过 flag.Var() 绑定自定义类型,自定义类型需要实现 Value 接口(Receives必须为指针)

5.1 代码

package main

import (
    "flag"
    "fmt"
    "strings"
)
// 自定义变量,并实现flag.Value接口
type Likes []string
func (l *Likes) String() string {
    return fmt.Sprintf("%v",*l)
}
func (l *Likes)Set(s string) error  {
    // 分割字符串
    split := strings.Split(s, ",")
    *l = split
    return nil
}
func main() {
    var likeList Likes
    // 接收自定义类型
    flag.Var(&likeList,"likes","接收自定义类型")
    // 解析
    flag.Parse()
    fmt.Println(likeList)
}

5.2 编译运行

# 编译
➜  go build main.go 
# 运行
➜  ./main -likes=篮球,足球,游戏
[篮球 足球 游戏]

6.flag.Args

一次打印出全部的入参,注意入参格式不能是-flag=val格式。

6.1 代码

package main
import (
    "flag"
    "fmt"
)
func main() {
    // 注意Parse是在Args之前调用
    flag.Parse()
    // 一次接收所有的参数
    args := flag.Args()
    fmt.Println(args)
}

6.2 编译运行

# 编译
➜  go build main.go 
# 错误入参示例
➜  ./main -name=张三 -age=18 -sex=男  
flag provided but not defined: -name
Usage of ./main:
# 正确入参示例
➜ ./main 张三 18 男            
[张三 18 男]

7.flag.Arg(i)

获取指定索引位置的参数,默认索引位置是0;注意入参格式不能是-flag=val格式。

7.1 代码

package main
import (
    "flag"
    "fmt"
)
func main() {
    // 注意Parse是在Arg之前调用
    flag.Parse()
    // 获取指定索引位置参数
    p0 := flag.Arg(0)
    p1 := flag.Arg(1)
    p2 := flag.Arg(2)
    fmt.Printf("索引=0,v=%v\n",p0)
    fmt.Printf("索引=1,v=%v\n",p1)
    fmt.Printf("索引=2,v=%v\n",p2)
}

7.2 编译运行

# 编译
➜  go build main.go 
# 传参
➜  ./main 张三 18 男  
索引=0,v=张三
索引=1,v=18
索引=2,v=男

相关文章

  • Go标准库flag使用

    Go语言标准库flag基本使用 Go语言内置的flag包实现了命令行参数的解析,flag包使得开发命令行工具更为简...

  • Golang 命令行 os.Args 和 flag包

    参考Go语言-命令行参数(os.Args, flag包) 大部分Go程序都是没有UI的,运行在纯命令行的模式下,该...

  • 《Go语言四十二章经》第三十四章 命令行flag包

    《Go语言四十二章经》第三十四章 命令行 flag 包 作者:李骁 34.1 命令行 写命令行程序时需要对命令参数...

  • Go语言命令行和运算符

    命令行参数 在Go语言中main函数是不接收任何参数的, 但是还是可以通过其它方式来接收命令行参数 方法一 导入o...

  • 参数flag

    flag 参数 flag包实现了命令行参数的解析。 -h=true 实现帮助文档 package mainimpo...

  • Golang学习笔记-flag

    使用flag包可以用来解析命令行参数,flag.TypeVar()用于定义参数并绑定到指定变量,flag.Type...

  • Golang获取命令行参数

    使用os.Args获取命令行参数 终端命令:go run main.go 20 马超 true 20 使用flag...

  • Emacs给Go一个更好的Playground

    ob-go简介Go特定的头参数(Header Arguments) 配置 编码流程 使用示例导入多个包命令行参数传...

  • pflag命令行参数

    简介 本文讲解如何在go程序中使用命令行参数包pflag来获取gong语言编写的命令行程序的传入参数。 命令行参数...

  • Golang标准库——flag

    flag包实现了命令行参数的解析。要求:使用flag.String(), Bool(), Int()等函数注册fl...

网友评论

      本文标题:go包:flag 接收命令行参数

      本文链接:https://www.haomeiwen.com/subject/xvhgrdtx.html