美文网首页
2021/4/6关于获取go程序命令行参数

2021/4/6关于获取go程序命令行参数

作者: 温岭夹糕 | 来源:发表于2021-04-06 20:48 被阅读0次

1.使用os获取简单命令行参数

根据文档中对os包的描述可得知,os的变量Args保存了命令行的参数(第一个是程序名称),因此我们不难写出一个“hello 用户名”的程序

//demo1
package main

import (
    "fmt"
    "os"
)

var name string

func init(){
    if len(os.Args)>1 {
        name = os.Args[1]
    } else {
        name = "world"
    }
}

func main(){
    fmt.Printf("Hello %s!\n",name)
}

但是问题来了,os.Args需要预先双方规定好如何输入,且输入都转为字符串,我们想要让程序像mysql一样接收 -u -p 这样的参数

2.使用flag解析命令行复杂参数

先看一个简单的demo,具体函数使用方法见文档

package main

import (
    "fmt"
    "flag"
)

var name string

func init(){
    flag.StringVar(&name,"name","world","please input  your name")  //[1]
}

func main(){
    flag.Parse() //[2]
    fmt.Printf("Hello %s!\n",name)
}
//执行程序 go run demo.go --name=zjb
  1. 在[1]位置,我们利用 flag.StringVar 注册了一个 flag
  2. 在[2]位置,等所有flag都注册完后,调用解析函数来解析命令行参数写入注册的flag
  3. 当我们执行--help时 ,获取到帮助信息 please input your name

阅读StringVal源码,实际是调用flagset 中的Var方法

func (f *FlagSet) StringVar(p *string, name string, value string, usage string) {
        f.Var(newStringValue(value, p), name, usage)
}

继续查找Var源头

func Var(value Value, name string, usage string) {
        CommandLine.Var(value, name, usage)
}

发现实际是调用变量CommandLine的方法

Command为何物?它是一个FlagSet,根据文档描述

CommandLine是默认的命令行flag集,用于解析os.Args

var CommandLine = NewFlagSet(os.Args[0], ExitOnError)

也就是说我们可以根据这个特性继续改造我们的程序(flagSet中有一个成员,为函数类型,用于在用户输入--help 或 参数类型错误时停止程序和抛出异常提示 )

package main

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

var name string


func init(){
    flag.CommandLine = flag.NewFlagSet("myCommand",flag.ExitOnError)
    flag.CommandLine.Usage = func(){
        fmt.Fprintf(os.Stderr, "Usage of %s:\n", "myCommand")
        flag.PrintDefaults()
    }
    flag.StringVar(&name, "name", "world", "please input your name")
}

func main(){
    flag.Parse()
    fmt.Printf("Hello %s!\n",name)
}

再简化一下

package main

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

var name string
var cmdLine =flag.NewFlagSet("myCommand",flag.ExitOnError)

func init(){
    cmdLine.StringVar(&name, "name", "world", "please input your name")
}

func main(){
    cmdLine.Parse( os.Args[1:] )
    fmt.Printf("Hello %s!\n",name)
}

ok,简介明了

3.拓展自定义类型

思路:利用Var方法,同时实现Value接口

package main

import (
    "fmt"
    "flag"
    "os"
)
//自定义类型
type myValue struct {
    p string
}
//实现接口的Set方法 负责解析传入的值
func (f *myValue) Set( v string ) error {
    f.p = v
    return nil
}
// 获取真正的值
func (f *myValue) String() string {
    return f.p
}
// 创建类实例指针
var name *myValue = &myValue{p:"world"}
var cmdLine =flag.NewFlagSet("myCommand",flag.ExitOnError)

func init(){
    cmdLine.Var(name, "name", "please input your name")
}

func main(){
    cmdLine.Parse( os.Args[1:] )
    fmt.Printf("Hello %s!\n",name.p)
}

本文内容及代码参考:

  1. GO核心36讲

相关文章

  • 2021/4/6关于获取go程序命令行参数

    1.使用os获取简单命令行参数 根据文档中对os包的描述可得知,os的变量Args保存了命令行的参数(第一个是程序...

  • pflag命令行参数

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

  • flag

    编写命令行程序时会使用不同的启动参数(命令行参数)来控制程序的行为 Go编写命令行程序时,获取并解析命令行参数的方...

  • golang 终端读写

    os.Args获取命令行参数 os.Args参数列表0 :程序路径(go run 运行 0 为临时工作目录的路径,...

  • go如何编写命令行(cli)程序

    创建一个命令行程序 问题 如何使用golang创建可以在命令行当中传递参数的程序?go如何带参数执行程序?比如我们...

  • Golang获取命令行参数

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

  • 第02天(函数、工程管理)_04

    18_defer和匿名函数结合使用.go 19_获取命令行参数.go 20_局部变量.go 21_全局变量.go ...

  • Golang 命令行 os.Args 和 flag包

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

  • APUE读书笔记-07进程环境(2)

    4、程序的命令行参数 程序的命令行参数是 main 的参数 argc , argv 指定的。前面第7章第2节说过这...

  • 第一章 基础了解

    目录: 1 Hello,word2 命令行参数3 查找重复的行4 GIF动画5 获取url6 并发获取多个url7...

网友评论

      本文标题:2021/4/6关于获取go程序命令行参数

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