zoukankan      html  css  js  c++  java
  • golang flag

    本文主要对golang环境下命令行的解析进行了相关的总结.命令行在C下有getopt等函数, 在golang下提供了更为方便的处理方法.

    1.命令行参数获取:
    命令行获得可通过os.Args参数,
    Args在os中定义为:
    var Args []string
    Args hold the command-line arguments, starting with the program name.
    2.命令行解析
    golang 对命令行解析提供了flag包,按照功能可以分为以下三类:
    1.基本命令解析
    2.自定义参数解析
    3.解析外部命令字符串

    1.基本命令解析
    命令注册:
    通过flag.type(int,string等),提供命令名称, 默认参数值
    按照返回值的形式分为两种, 返回值为值的指针, 通过传入指针,解析值后写入传入的指针
    命令解析:
    调用flag.Parse()解析命令行

    2.自定义参数命令解析
    自定义变量实现下面的接口:
    type Value interface {
    String() string
    Set(string) error
    }
    并定义变量,通过flag.Var传入自定义变量

    注册命令解析:
    var argFlag args
    flag.Var(&argFlag, "arg", "comma-separated list of intervals to use between events")
    3.解析外部命令字符串
    通过flag.NewFlagSet创建flagset.通过set的相关接口注册命令,通过set.Parse解析参数

    实践代码如下:

    package main
    
    import (
        "errors"
        "flag"
        "fmt"
        "strings"
        "time"
    )
    
    type args []string
    
    func (a *args) String() string {
        return fmt.Sprintf("%v", *a)
    }
    
    func (i *args) Set(value string) error {
        if len(*i) > 0 {
            return errors.New("interval flag already set")
        }
        for _, dt := range strings.Split(value, ",") {
            *i = append(*i, dt)
        }
        return nil
    }
    
    
    //基本解析函数的使用
    func base_parse() {
        const (
            defaultGopher = "pocket"
            usage         = "the variety of gopher"
        )
        var log int
        //init for init param, return int point
        // param:name, deaault val, help message
        //解析参数通过指针返回
        var intflag = flag.Int("int", 100, "help message for int")
        flag.StringVar(&gopherType, "gopher_type", defaultGopher, usage)
        flag.StringVar(&gopherType, "g", defaultGopher, usage+"(shorthand)")
        //指定一个传入参数的指针
        flag.IntVar(&log, "log_level", 0, "log level")
        flag.Parse()
        fmt.Println("initFlag:", *intflag)
        fmt.Println("log_level:", log)
        fmt.Println("gopherType string ", gopherType)
    }
    
    /*自定义参数解析*/
    func userdef_parse() {
        var argFlag args
        flag.Var(&intervalFlag, "deltaT", "comma-separated list of intervals to use between events")
        flag.Var(&argFlag, "arg", "comma-separated list of intervals to use between events")
        flag.Parse()
        fmt.Println("arg  string ", argFlag)
        fmt.Println(intervalFlag)
    }
    
    /*解析传入的字符串*/
    func parse_input(arg string) {
        argv := []string{}
        for _, dt := range strings.Split(arg, " ") {
            argv = append(argv, dt)
        }
        //创建flagSet
        set := flag.NewFlagSet("test", flag.ExitOnError)
        //注册解析参数
        varflag := set.String("ver", "myver", "version")
        pflag := set.String("p", "myp", "version")
        //解析参数
        set.Parse(argv)
        fmt.Println("input parse:", *varflag, *pflag)
    }
    func main() {
        userdef_parse()
        parse_input("-p 123 -ver 1234")
    }
    欢迎评论交流
  • 相关阅读:
    ExtJS 4布局
    ExrJS4学习笔记1 类
    Jquery实现动态添加按钮
    ExtJs 4 MVC
    读取目录下所有目录和文件加载到TreeView
    利用List的Sort()、Find()、FindAll()、Exist()來解決一些問題
    html常用
    ExtJs3.3 TreePanel,checked节点和平常节点同时存在
    sql server 常用查询
    美女时钟网页代码
  • 原文地址:https://www.cnblogs.com/linengier/p/8326089.html
Copyright © 2011-2022 走看看