美文网首页golang
07-Go语言命令行参数-指趣学院

07-Go语言命令行参数-指趣学院

作者: 极客江南 | 来源:发表于2018-09-16 22:00 被阅读254次

    go命令行操作指令

    • 标准go语言项目文件目录格式
      • 项目文件夹就是GOPATH指向的文件夹
      • src文件夹是专门用于存放源码文件的
        • main文件夹是专门用于存储package main包相关源码文件的
        • 其它文件夹是专门用于存储除package main包以外源码文件的
      • bin文件夹是专门用于存储编译之后的可执行程序的
      • pag文件夹是专门用于存储编译之后的.a文件的

    |---项目文件夹
    -----------|--------src文件夹
    -----------------------------|--------main文件夹
    -----------------------------|--------其它文件夹
    -----------|--------bin文件夹
    -----------|--------pkg文件夹


    • go version 查看当前安装的go版本
    • go env 查看当前go的环境变量
    • go fmt 格式化代码
      • 会将指定文件中凌乱的代码按照go语言规范格式化
    • go run 命令文件 编译并运行go程序
      • package main包中包含main函数的文件, 我们称之为命令文件
      • 其它包中的文件, 我们称之为源码文件
    • go build 编译检查
      • 对于非命令文件只会执行编译检查, 不会产生任何文件
      • 对于命令文件除了编译检查外,还会在当前目录下生成一个可执行文件
      • 对应只想编译某个文件, 可以在命令后面指定文件名称go build 文件名称
    • go install 安装程序
      • 对于非命令文件会执行编译检查, 并生成.a结尾的包, 放到 $GOPATH/pkg目录中
      • 对于命令文件会执行编译检查, 并生成可执行程序, 放到$GOPATH/bin目录中

    通过os包获取命令行参数

    • C语言中的命令行参数
      • argc: argv中保存数据的个数
      • argv: 默认情况下系统只会传入一个值, 这个值就是main函数执行文件的路径
      • 我们可以通过配置开发工具,或者命令行运行时以空格+参数形式传递其它参数
      • 注意点: 无论外界传入的是什么类型, 我们拿到的都是字符串类型
    #include <stdio.h>
    int main(int argc, const char * argv[])
    {
        for(int i = 0; i < argc; i++){
            printf("argv[%d] = %s\n", i, argv[i]);
        }
        return 0;
    }
    
    • Go语言中的命令行参数
      • Go语言中main函数没有形参, 所以不能直接通过main函数获取命令行参数
      • 想要获取命令行参数必须导入os包, 通过os包的Args获取
      • 注意点: 无论外界传入的是什么类型, 我们拿到的都是字符串类型
    package main
    
    import (
        "fmt"
        "os" // 用于获取命令行参数的包
    )
    func main() {
        // 1.获取传入参数个数
        num := len(os.Args)
        // 2.打印所有获取到的参数
        for i := 0; i < num; i++ {
            fmt.Println(os.Args[i])
        }
    }
    

    通过flag包获取命令行参数

    • Go语言中除了可以通过os包获取命令行参数以外,还可以通过flag包获取命令行参数
    package main
    import (
        "flag"
        "fmt"
    )
    func main() {
        /*
        flag.Xxxx(name, value, usage)
        第一个参数: 命令行参数名称
        第二个参数: 命令行参数对应的默认值
        第三个参数: 命令行参数对应的说明
        */
        // 1.设置命令行参数
        name := flag.String("name", "lnj", "请输入人的姓名")
        age := flag.Int("age", 33, "请输入人的年龄")
        // 2.将命令行参数解析到注册的参数
        flag.Parse()
        // 3.使用命令行参数
        // 注意flag对应方法返回的都是指针类型, 所以使用时必须通过指针访问
        fmt.Println("name = ", *name)
        fmt.Println("age = ", *age)
    }
    
    • flag获取命令行参数第二种写法
    package main
    import (
        "flag"
        "fmt"
    )
    func main() {
        /*
        flag.Xxxx(*type, name, value, usage)
        第一个参数:保存命令行参数变量地址
        第二个参数: 命令行参数名称
        第三个参数: 命令行参数对应的默认值
        第四个参数: 命令行参数对应的说明
        */
        // 1.定义变量,保存命令行参数的值
        var name string
        var age int
        // 2.设置命令行参数
        flag.StringVar(&name, "name", "lnj", "请输入人的姓名")
        flag.IntVar(&age, "age", 33,"请输入人的姓名")
        // 3.注册解析命令行参数
        flag.Parse()
        // 4.使用命令行参数
        fmt.Println("name = ", name)
        fmt.Println("age = ", age)
    }
    

    os包和flag包获取命令行参数对比

    • 通过os包获取命令行参数
      • 如果用户没有传递参数报错
      • 需要严格按照代码中的顺序传递参数, 否则造成数据混乱
      • 不能指定参数的名称
      • 获取到的数据都是字符串类型
    package main
    import (
        "os"
        "fmt"
    )
    int main(){
        name := os.Args[1]
        age := os.Args[2]
        fmt.Println("name = ", name)
        fmt.Println("age = ", age)
    }
    
    • 通过flag包获取命令行参数

      • 如果用户没有传递参数不会报错
      • 不需要严格按照代码中的顺序传递参数, 不会造成数据混乱
      • 可以指定参数的名称
      • 获取到的数据是我们自己指定的类型
    package main
    import (
        "flag"
        "fmt"
    )
    int main(){
        name := flag.String("name", "lnj", "请输入人的姓名")
        age := flag.Int("age", 33, "请输入人的年龄")
        // 2.注册解析命令行参数
        flag.Parse()
        // 3.使用命令行参数
        // 注意flag对应方法返回的都是指针类型, 所以使用时必须通过指针访问
        fmt.Println("name = ", *name)
        fmt.Println("age = ", *age)
    }
    

    相关文章

      网友评论

        本文标题:07-Go语言命令行参数-指趣学院

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