• Go使用flag包开发命令行工具


    flag包是Go语言标准库提供用来解析命令行参数的包,使得开发命令行工具更为简单

    常用方法

    1.flag.Usage

    输出使用方法,如linux下ls -h的帮助输出

    2.flag.Type(参数名, 默认值, 使用提示)

    Type为类型 如String, Int, Uint 调用相应的flag.Sring flag.Int flag.Uint方法

    方法返回相应类型的指针

    3.flag.Type(指针, 参数名, 默认值, 使用提示)

    与flag.Type方法基本相同,不同的是多一个指针参数,将使用传入的指针,不会再创建指针返回

    4.flag.Args

    返回解析完命令行参数后的其他参数,如./sh -name cqh  a1 a2,将返回a1 a2

    5.flag.Parse

    执行解析

    使用示例代码

    创建test.go

    package main
    
    import (
        "fmt"
        "flag"
    )
    
    func main() {
        namePtr := flag.String("name", "username", "姓名")
        agePtr := flag.Int("age", 18, "年龄")
        musclePtr := flag.Bool("muscle", true, "是否有肌肉")
    
        var email string
        flag.StringVar(&email, "email", "chenqionghe@sina.com", "邮箱")
    
    
        flag.Parse()
    
        args := flag.Args()
        fmt.Println("name:", *namePtr)
        fmt.Println("age:", *agePtr)
        fmt.Println("muscle:", *musclePtr)
        fmt.Println("email:", email)
        fmt.Println("args:", args)
    }
    

      

    执行go buld后,建立test执行文件

    ./test -h

    输出

    Usage of ./test:
      -age int
            年龄 (default 18)
      -email string
            邮箱 (default "chenqionghe@sina.com")
      -muscle
            是否有肌肉 (default true)
      -name string
            姓名 (default "username")
    

     

    执行

    ./test -name 肌肉男 -age 20 -email muscle@muscle.com 哈哈 呵呵 嘿嘿
    

     输出

    name: 肌肉男
    age: 20
    muscle: true
    email: muscle@muscle.com
    args: [哈哈 呵呵 嘿嘿]
    

      

    自定义flag

    只要实现flag.Value接口即可

    type Value interface {
      String() string
      Set(string) error
    }

    如下定义了一个Hello类型,实现了Value接口

    //自定义解析参数,实现Set和String方法
    type Hello string
    
    func (p *Hello) Set(s string) error {
        v := fmt.Sprintf("Hello %v", s)
        *p = Hello(v)
        return nil
    }
    
    func (p *Hello) String() string {
        return fmt.Sprintf("%f", *p)
    }
    

    使用示例代码  

    package main
    
    import (
        "fmt"
        "flag"
    )
    
    
    //自定义解析参数,实现Set和String方法
    type Hello string
    
    func (p *Hello) Set(s string) error {
        v := fmt.Sprintf("Hello %v", s)
        *p = Hello(v)
        return nil
    }
    
    func (p *Hello) String() string {
        return fmt.Sprintf("%f", *p)
    }
    
    
    
    func main() {
        namePtr := flag.String("name", "username", "姓名")
        agePtr := flag.Int("age", 18, "年龄")
        musclePtr := flag.Bool("muscle", true, "是否有肌肉")
    
        var email string
        flag.StringVar(&email, "email", "chenqionghe@sina.com", "邮箱")
    
        var hello Hello
        flag.Var(&hello, "hello", "hello参数")
    
        flag.Parse()
        others := flag.Args()
        fmt.Println("name:", *namePtr)
        fmt.Println("age:", *agePtr)
        fmt.Println("vip:", *musclePtr)
        fmt.Println("hello:", hello)
        fmt.Println("email:", email)
        fmt.Println("other:", others)
    }
    

      

    重新build后运行

    ./test -name 肌肉男 -age 20 -email muscle@muscle.com -hello 陈琼和  哈哈 呵呵 嘿嘿
    

     输出

    name: 肌肉男
    age: 20
    vip: true
    hello: Hello 陈琼和
    email: muscle@muscle.com
    other: [哈哈 呵呵 嘿嘿]
    

      

    就是这样,Light weight baby !

  • 相关阅读:
    如何让你的Sublime和Codeblocks支持C++11
    Python print不换行输出的替代方法
    阶梯博弈
    hdu4633_Polya定理
    Ural_1169_Pairs
    ACM竞赛中的魔方问题专题(不定时更新)
    LintCode 35. 翻转链表
    windows中mysql5.7中配置中文字符集和默认datadir
    CentOS7使用打开关闭防火墙与端口
    关于阿里巴巴开发手册"不得使用外键与级联,一切外键概念必须在应用层解决"的疑惑
  • 原文地址:https://www.cnblogs.com/chenqionghe/p/8295807.html
Copyright © 2020-2023  润新知