zoukankan      html  css  js  c++  java
  • go语言的3个包——strconv、os.Args、flag

    1. strconv包:


    2. os.Args:

    获取运行程序时给出的参数,可以通过os包来实现。看代码:

    package main
    
    import (
        "fmt"
        "os"
        "strconv"
    )
    
    func main () {
        for idx, args := range os.Args {
            fmt.Println("参数" + strconv.Itoa(idx) + ":", args)
        }
    }      

    在终端运行上面程序的结果:

    可以看到,命令行参数包括了程序路径本身,以及通常意义上的参数。 
    程序中os.Args的类型是 []string ,也就是字符串切片。所以可以在for循环的range中遍历,还可以用 len(os.Args) 来获取其数量。

    * 如果不想要输出os.Args的第一个值(可执行文件本身的信息),可以修改上述程序:

    for idx, args := range os.Args[1:] {}
    

    将range后面的切片,去掉第一个元素。(切片操作做是“前闭后开”)

    再次执行,结果如下:

    * 输出切片的所有元素,除了 for循环, 还有更简洁的方式:

    // 方式一:
    fmt.Println(strings.Join(os.Args[1:], "
    "))
    
    // 方式二:
    fmt.Println(os.Args[1:])

    两种方式ide执行结果对应如下:


    3. flag包

    flag包相比单纯的通过os.Args切片分析命令行参数,提供了更强的能力。看个例子:

    package main
    
    import (
        "fmt"
        "flag"
    )
    
    var b = flag.Bool("b", false, "bool类型参数")
    var s = flag.String("s", "", "string类型参数")
    
    func main() {
        flag.Parse()
        fmt.Println("-b:", *b)
        fmt.Println("-s:", *s)
        fmt.Println("其他参数:", flag.Args())
    }

    在终端cmd上的执行结果:

    -----------------------------------------------------------------------------------------------

    对于上面的bool型参数b,只有给出和不给出两种情况。需要注意:

    var b = flag.Bool("b", false, "bool类型参数")
    

    如果把false改成true——

    var b = flag.Bool("b", true, "bool类型参数") 

     ------------------------------------------------------------------------------------------------------------

    详解

    3.1 定义参数

    首先定义待解析命令行参数,也就是以 “-” 开头的参数,比如这里的 -b -s -help等。

    -help不需要特别指定,可以自动处理。

    这里指定了两个参数,-b 和 -s:

    var b = flag.Bool("b", false, "bool类型参数")
    var s = flag.String("s", "", "string类型参数")
    
    ---原型:
    func Bool(name string, value bool, usage string) *bool
    func String(name string, value string, usage string) *string
    

    通过 flag.Bool() 和 flag.String(),建立了2个指针 b 和 s,分别指向 bool 类型和 string 类型的变量。所以后续要通过 *b 和 *s 使用变量值。

    flag.Bool() 和 flag.String() 的参数有3个,分别是:命令行参数名称,默认值,提示字符串

    参数功能
    name 命令行参数名称,比如 -b, -help
    value 默认值,未显式指定的参数,给出隐式的默认值,比如本例中-b未给出的话,*b=false
    usage 提示信息,如果给出的参数不正确或者需要查看帮助 -help,那么会给出这里指定的字符串

     

    3.2 解析参数

    flag使用前,必须首先解析:

    flag.Parse() 

    3.3 使用参数

    上文已经说明,通过flag方法定义好的参数变量指针,通过间接引用操作即可使用其内容:

    fmt.Println("-b:", *b)
    fmt.Println("-s:", *s)  

    3.4 未解析参数

    参数中没有按照预定义的参数解析的部分,通过 flag.Args() 即可获取,是一个字符串切片。

    fmt.Println("其他参数:", flag.Args()) 

    需要注意的是,从第一个不能解析的参数开始,后面的所有参数都是无法解析的。即使后面的参数中含有预定义的参数:

    上面例子中,解析到stop,就已经无法继续解析了,因为stop既不是传给 -b 的布尔值,也不是预定义参数。即使后面给出了预定义好的 -s,也不能获取出来。


    拿图说话!! flag提供了Arg(i)和Args()来获取non-flag参数(即未被解析的参数),NArg()来获取non-flag的个数。正如下面看到的:

     

     

    ///纵有疾风起,人生不言弃///
  • 相关阅读:
    MSDN Magazine搞错了
    Visual Studio 2005中设置调试符号(Debug Symbols)
    BCB 6的问题
    吴裕雄天生自然Spring Boot使用Spring Data JPA实现人与身份证的一对一关系映射
    吴裕雄天生自然Spring BootSpring Data JPA
    吴裕雄天生自然Spring BootSpring Boot对JSP的支持
    吴裕雄天生自然Spring BootSpring Boot的异常统一处理
    吴裕雄天生自然Spring Boot使用Spring Data JPA实现Author与Article的一对多关系映射
    吴裕雄天生自然Spring Boot解决 Error creating bean with name 'entityManagerFactory' defined in class path resource
    吴裕雄天生自然Spring Boot@ExceptionHandler注解和@ControllerAdvice注解
  • 原文地址:https://www.cnblogs.com/skzxc/p/11470676.html
Copyright © 2011-2022 走看看