• GO语言学习:简单源码入门


    1.一个简单的hello,world!

      在工作区目录下使用命令vim demo1.go,进入代码编辑模式,在其中写入以下代码:

        package main                        //声明包名

        import "fmt"                        //引入包

        func main(){

          fmt.Println("Hello,world!")           //打印

        }

      保存.

      使用命令go build demo1.go ,会发下在同级目录下生成一个demo1的文件.

      使用命令 ./demo1  运行,在终端打印Hello,world!,执行成功.

      同样,保存后也可以直接使用命令 go run demo1.go ,也会在终端打印.

    2.源码文件带参数执行

      go语言标准库中有一个代码包专门用来接收和解析命令参数,此代码包叫做flag.

      在工作区目录下使用命令vim demo2.go,进入代码编辑模式,在其中写入以下代码:

        package main

        import(

            "flag"

            "fmt"

        )

        var name string

        func init(){

            flag.StringVar(&name,"name","everyone","The greeting object.")

        }

        func main(){

            flag.Parse();

            fmt.Printf("Hello,%s! ",name)    

        }

        

      保存.

      使用命令go build demo2.go ,会发下在同级目录下生成一个demo2的文件.

      不带参数执行:      

        使用命令 ./demo2  运行,在终端打印Hello,everyone!,执行成功.

      带参数执行:

        使用命令 ./demo2 -name="jxd"  运行,在终端打印Hello,jxd!,执行成功.

        

      同样保存后也可直接使用命令 go run demo2.go -name="jxd"  ,也会在终端打印.

      解释:

      flag.StringVar(&name,"name","everyone","The greeting object.")

        第一个参数用来存放该命令参数的地址.

        第二个参数是该命令参数的名称,执行时后面用 -name="xxx".

        第三个参数是不带参数执行时,默认打印的值.

        第四个参数为命令参数的简单说明.

        

      flag.Parse() 用于真正的解析参数,并把他们的值赋给相应的变量.

    3. go run 和go build

      使用命令 go build 会在同级目录下生成一个文件

        使用命令./demo2 --help 会打印如下信息:

          Usage of ./demo2:

            -name string

              The greeting object.(default "everyone")

      使用命令 go run demo2.go --help 会打印如下信息:

          Usage of /tmp/go_build577199614/boo1/exe/demo2                  //构建源码文件时,临时生成的可执行文件的完整路径

            -name string

              The greeting object.(default "everyone")

          exit status 2

    4.自定义源码文件的参数使用说明

     新建demo3.go 写入以下代码,demo3与demo2的区别在与加入了代码中红色代码部分

      package main

      import(

          "flag"

          "fmt"

          "os"

      )

      var name string

      func init(){

          flag.StringVar(&name,"name","everyone","The greeting object.")

      }

      func main(){

          flag.Usage=func(){

            fmt.Fprintf(os.Stderr,"Usage of %s: ","question")

            flag.PrintDefaults()

          }

          flag.Parse();

          fmt.Printf("Hello,%s! ",name)    

      }

      使用命令 go run demo3.go --help,发现输出为:

        Usage of question:

          -name string

            The greeting object.(default "everyone")

        exit status 2

      与之前的输出临时的路径不同,这样我们就自定义了源码文件的参数使用说明

      再深一层,我们调用flag包中一些函数的时候(StringVar,Parse),实际上是再调用flag.CommandLine的一些对应函数.

      新建demo4.go,写入以下代码,与demo2.go的区别为红色代码部分

        package main

        import(

            "flag"

            "fmt"

            "os"

        )

        var name string

        func init(){

            flag.CommandLine=flag.NewFlagSet("",flag.ExitOnError)

            flag.CommandLine.Usage=func(){

              fmt.Fprintf(os.Stderr,"Usage of %s: ","question")

              fmt.PrintDefaults()

              }

            flag.StringVar(&name,"name","everyone","The greeting object.")

        }

        func main(){

            flag.Parse();

            fmt.Printf("Hello,%s! ",name)    

        }

        使用命令 go run demo4.go --help,输出同demo3.go一样.

        把demo4.go 中flag.CommandLine=flag.NewFlagSet("",flag.ExitOnError),修改为 flag.CommandLine=flag.NewFlagSet("",flag.PanicOnError)后,

        使用命令 go run demo4.go --help 运行,会发现输出又不同.

        flag.ExitOnError的含义:告诉命令参数容器,当命令后跟--help或者参数设置不正确时,在打印命令参数使用说明后以状态码2结束当前程序.

        状态码2代表用户错误的使用了命令,而flag.PanicOnError与之的区别是在最后抛出“运行时恐慌(panic)”.

        

        上述两种情况在调用flag.Parse函数时会被触发。

        

        新建demo5.go,写入以下代码  

          package main

          import(

              "flag"

              "fmt"

              "os"

          )

          var name string

          var cmdLine=flag.NewFlagSet("question",flag.ExitOnError)

          func init(){

              cmdLine.StringVar(&name,"name","everyone","The greeting object.")

          }

          func main(){

              cmdLine.Parse(os.Args[1:]);

              fmt.Printf("Hello,%s! ",name)    

          } 

        使用命令 go run demo5.go --help 运行,也可实现自定义源码文件的参数使用说明.

        cmdLine.Parse(os.Args[1:]);指给定的命令参数

        因此,这样就完全脱离了flag.CommandLine,更灵活的定制命令参数使用说明,并且不会影响全局的变量flag.CommandLine.

      

    不为其他,只为快乐!
  • 相关阅读:
    Missing return type on function. eslint(@typescripteslint/explicitmoduleboundarytypes))
    vs 引用外部dll并部署到开发环境
    DockerFile介绍
    Docker使用
    Docker 镜像打包
    封装一个工具类计算一张1毫米的纸折叠多少次会超过10万公里【杭州多测师】【杭州多测师_王sir】
    Python经典题目:回文数【杭州多测师】【杭州多测师_王sir】
    java开发中,涉及到金钱计算的时候用什么数据类型,存储贷款金额用什么数据类型【杭州多测师】【杭州多测师_王sir】
    蚂蚁金服二面笔试题【杭州多测师】【杭州多测师_王sir】
    蚂蚁金服测试开发的面试题【杭州多测师】【杭州多测师_王sir】
  • 原文地址:https://www.cnblogs.com/1521299249study/p/10038624.html
Copyright © 2020-2023  润新知