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!\n",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:\n","question")
        flag.PrintDefaults()
      }
      flag.Parse();
      fmt.Printf("Hello,%s!\n",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:\n","question")
          fmt.PrintDefaults()
          }
        flag.StringVar(&name,"name","everyone","The greeting object.")
    }
    func main(){
        flag.Parse();
        fmt.Printf("Hello,%s!\n",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!\n",name)    
 
    使用命令 go run demo5.go --help 运行,也可实现自定义源码文件的参数使用说明.
    cmdLine.Parse(os.Args[1:]);指给定的命令参数
    因此,这样就完全脱离了flag.CommandLine,更灵活的定制命令参数使用说明,并且不会影响全局的变量flag.CommandLine.