Go语言的使用命令行程序

出于如下原因,程序员想创建命令行程序:

1、为创建能够定期自动运行的脚本。

2、为创建与系统中的文件交互的脚本。

3、为创建能够执行系统维护任务的脚本。

4、为避免设计图形用户界面这种无谓的开销。

在Mac os的终端上,输入命令行:

vim beatles.txt

打开vim,输入内容如下:

John
Paul
Ringo
George

保存和退出。

输入命令行如下:

sort beatles.txt

运行结果如下:

George
John
Paul
Ringo

操作输入和输出

操作输入和输出的代码及其含义
名称代码描述
标准输入0包含提供给程序的输入
标准输出1包含显示到屏幕上的输出
标准错误2包含显示到屏幕上的错误消息

输入命令行,删除beatles.txt,如下:

rm beatles.txt

再次输入命令行如下:

sort beatles.txt

运行结果如下:

sort: No such file or directory

访问命令行参数,程序清单如下:

package main

import(
  "fmt"
  "os"
)

func main(){
  for i,arg:=range os.Args{
    fmt.Println("argument",i,"is",arg)
  }
}

有两次输入命令行如下:

go build main.go

./main

运行结果如下:

argument 0 is ./main

输入命令行如下:

./main for bar baz

运行结果如下:

argument 0 is ./main
argument 1 is for
argument 2 is bar
argument 3 is baz

输入命令行如下:

go run main.go

运行结果如下:

argument 0 is /var/folders/3x/txs8lfzs6s13njkkrvjmnz2c0000gn/T/go-build2259276456/b001/exe/main

分析命令行标志,程序清单如下:

package main

import(
  "fmt"
  "flag"
)

func main(){
  s:=flag.String("s","Hello World","String help text")
  flag.Parse()
  fmt.Println("value of s:",*s)
}

有两次输入命令行如下:

go build main.go

./main

运行结果如下:

value of s: Hello World

输入命令行如下:

./main -s Goodbye

运行结果如下:

value of s: Goodbye

输入命令行如下:(-h、--h、-help、--help)

./main -h

运行结果如下:

Usage of ./main:
  -s string
    	String help text (default "Hello World")

指定标志的类型

flag包根据声明分析标志的类型,这对应于Go语言的类型系统。

分析String、Int和Boolean标志,程序清单如下:

package main

import(
  "flag"
  "fmt"
)

func main(){
  s:=flag.String("s","Hello world","String help text")
  i:=flag.Int("i",1,"Int help text")
  b:=flag.Bool("b",false,"Bool help text")
  flag.Parse()
  fmt.Println("value of s:",*s)
  fmt.Println("value of i:",*i)
  fmt.Println("value of b:",*b)
}

两次输入命令行如下:

go build main.go

./main

运行结果如下:

value of s: Hello world
value of i: 1
value of b: false

输入命令行如下:

./main -s Goodbye -i 42 -b

运行结果如下:

value of s: Goodbye
value of i: 42
value of b: true

输入命令行如下:

./main -i String

运行结果如下:

invalid value "String" for flag -i: parse error
Usage of ./main:
  -b	Bool help text
  -i int
    	Int help text (default 1)
  -s string
    	String help text (default "Hello world")

如果用户执行命令行程序时给标志指定的值的类不正确,将显示错误消息。上面的示例中,将标志-i设置成为字符串String。由于必须将这个标志设置为整数值,因此将导致错误:flag包的默认行为是打印错误消息并显示帮助文本。

自定义帮助文本

给命令行工具创建帮助文本,程序清单如下:

package main

import(
  "flag"
  "fmt"
  "os"
)

func main(){
  flag.Usage=func(){
    usageText:=`Usage example [OPTION]
    An example of customizing usage output
    -s,--s    example string argument, default: String help text
    -i,--i    example integer argument, default: Int help text
    -b,--b    example boolean argument, default: Bool help text`
    fmt.Fprintf(os.Stderr,"%s\n",usageText)
  }
  s:=flag.String("s","Hello world","String help text")
  i:=flag.Int("i",1,"Int help text")
  b:=flag.Bool("b",true,"Bool help text")
  flag.Parse()
  fmt.Println("value of s:",*s)
  fmt.Println("value of i:",*i)
  fmt.Println("value of b:",*b)
}

两次输入命令行,如下:也可以指定选项-h。

go build main.go

./main --help

运行结果如下:

Usage example [OPTION]
    An example of customizing usage output
    -s,--s    example string argument, default: String help text
    -i,--i    example integer argument, default: Int help text
    -b,--b    example boolean argument, default: Bool help text

输入命令行“./main”的运行结果如下:

value of s: Hello world
value of i: 1
value of b: true

flag包会自动生成帮助文本。变量Usage设置为一个函数,这样每当在分析标志的过程中发生错误时,都将调用这个函数。

使用标准库中的os包来将消息打印到标准误差(standard Error),因为这条消息将在发现分析错误时显示,但输出是完全可定制的。

创建子命令

很多命令行程序都支持子命令。

要创建子命令并指定标志,如下:

cloneCmd:=flag.NewFlagSet("clone",flag.ExitOnerror)

其中第一个参数为子命令名,而第二个参数则指定了错误处理行为。

flag.ContinueOnError:如果没有分析错误,就继续执行。

flag.ExitOnError:如果有分析错误,就退出并将状态码设置为2 。

flag.PanicOnError:如果发生分析错误,就引发panic。

在命令行程序中使用子命令,程序清单如下:

package main

import(
  "flag"
  "fmt"
  "os"
  "strings"
)
func flagUsage(){
  usageText:=`example is an example cli tool.

Usage:
example command [arguments]
The commands are:
uppercase uppercase a string
lowercase lowercase a string
Use "example [command] --help" for more information about a command.`
  fmt.Fprintf(os.Stderr,"%s\n",usageText)
}
func main(){
  flag.Usage=flagUsage
  uppercaseCmd:=flag.NewFlagSet("uppercase",flag.ExitOnError)
  lowercaseCmd:=flag.NewFlagSet("lowercase",flag.ExitOnError)
  if len(os.Args)==1{
    flag.Usage()
    return
  }
  switch os.Args[1]{
  case "uppercase":
    s:=uppercaseCmd.String("s","","A string of text to be upercased")
    uppercaseCmd.Parse(os.Args[2:])
    fmt.Println(strings.ToUpper(*s))
  case "lowercase":
    s:=lowercaseCmd.String("s","","A string of text to be lowercased")
    lowercaseCmd.Parse(os.Args[2:])
    fmt.Println(strings.ToLower(*s))
  default:
    flag.Usage()
  }
}

输入命令行如下:

./main uppercase -s "i want to grow up"

运行结果如下:

I WANT TO GROW UP

输入命令行如下:

./main lowercase -s "I DO NOT WANT TO GROW UP"

运行结果如下:

i do not want to grow up

POSIX兼容性:省略。

安装和分享命令行程序

要让Go工具发挥作用,必须遵循Go语言约定。必须正确地设置$GOPATH。使用标准的目标布局,并将代码放在一个位于src的子文件夹中。

|——bin

|——pkg

|——src

        |——github.com

子文件夹的路径如下:

$GOPATH/src/github.com/douxiaobo/

Go项目位于这个文件夹中。在这个文件夹中创建一个名为heloworld的文件夹如下:

// Linux / macOS

$ mkdir -p $GOPATH/src/github.com/[your github username]/helloworld

// Windows

$ mkdir "$GOPATH\src\github.com\[your github username]\helloworld"

访问命令行参数,程序清单如下:

package main

import(
	"fmt"
)

func main(){
	fmt.Println("Hurray! You are a Gopher!")
}

使用命令GO install安装这个程序。指定的路径必须是相对于$GOPATH的。

命令行如下:

go install github.com/[your github usrername]/helloworld

将代码提交到Github,让别人能用使用下面的命令轻松地安装它,输入命令行如下:

go get github.com/[your github usrername]/helloworld

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值