操作输入和输出
名称 | 代码 | 描述 |
---|---|---|
标准输入 | 0 | 包含提供给程序的输入 |
标准输出 | 1 | 包含显示到屏幕上的输出 |
标注错误 | 2 | 包含显示到屏幕上的错误信息 |
- 标准输入时提供给命令行程序的数据,可以是文件,字符串
- 标准输出是来自程序的输入
访问命令行参数
在Go语言中,要读取传递给命令行程序的参数,可以使用标准库中的OS包
package main
import (
"fmt"
"os"
)
func main(){
for i,arg := range os.Args{
fmt.Println("argument",i,"is",arg)
}
}
方法Args返回一个字符串切片,其中包含程序的名称以及传递给程序的所有参数,可以使用go build
来构建可执行程序
分析命令行标志
Go语言在标准库钟提供了flag包
- 指定作为参数传递的值的类型
- 设置标志的默认值
- 自动生成帮助文本
package main
import (
"flag"
"fmt"
)
func main(){
s := flag.String("s","Hello world","String help text")
flag.Parse()
fmt.Println("value of s:",*s)
}
- 声明变量s并将其设置为flag.String返回的值
- flag.String能够声明命令行标志,并指定其名称、默认值和帮助文本
- 调用
flag.Parse
,让程序能够传递声明的参数 - 最后,打印变量s的值,请注意,
flag.String
返回的是一个指针,因此使用运算符*
对其解除引用,显示底层的值
flag包会自动创建一个帮助文本,可以使用-help
来进行显示
指定标志的类型
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)
}
在控制台输入test -s "siqu" -i 2 -b true
//结果
value of s: siqu
value of i: 2
value of b: true
如果传递了错误的参数类型,则系统会报错
自定义帮助文本
虽然可以自动生成帮助文本,但是帮助文本是完全可以自定定义的
flag.Usage = func(){
fmt.Fprintln(os.Stderr,"hello world")
}
这里使用了标准库中的os包来将消息打印到标准误差,因为这条消息将在发现错误时显示
自定义帮助文档
package main
import (
"flag"
"fmt"
"os"
)
func main(){
flag.Usage = func(){
usageText :=`help
-s string default:String help text
-i int default:int help text
-b bool 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",false,"bool help text")
flag.Parse()
fmt.Println("value of s:",*s)
fmt.Println("value of i:",*i)
fmt.Println("value of b:",*b)
}
//test -help
// help
// -s string default:String help text
// -i int default:int help text
// -b bool default:bool help text
//test
// value of s: Hello world
// value of i: 1
// value of b: false
在这里,使用了原始字面量,可以包含格式一起输出
创建子命令
很多命令行程序都支持子命令,比如git
git clone
git branch
这个子命令的help选项,都不一样,flag包通过FlagSets
提供子命令支持
cloneCmd := flag.NewFlagSet("clone",Flag.ExitOnError)
- 第一参数为子命令名称,而第二个参数为指定了错误处理行为
flag.ContinueOnError
:如果分析没有错误,就继续执行flag.ExitOnError
:如果有分析错误,就退出并将状态码设置为2flag.PanicOnError
:如果发生分析错误,就引发panic
package main
import (
"fmt"
"os"
"flag"
"strings"
)
func main(){
//设置子命令
upper := flag.NewFlagSet("upercase",flag.ExitOnError)
lower := flag.NewFlagSet("lowercase",flag.ExitOnError)
//创建帮助文档
flag.Usage = func(){
usageText :=`help
upercase a string of text to be upper
lowercase a string of text to be lowper
`
fmt.Fprintf(os.Stderr,"%s\n",usageText)
}
//如果没有传递参数,也就是参数长度为1,则输出帮助文档
if len(os.Args) == 1{
flag.Usage()
return
}
//由于第一个参数为程序名称,因此从二个参数开始
switch os.Args[1]{
//如果使用子命令的处理方式
case "upercase":
//子命令的标志
s := upper.String("s","","a string of text to be upper")
upper.Parse(os.Args[2:])
fmt.Println(strings.ToUpper(*s))
case "lowercase":
//设置子命令的标志
s := lower.String("s","","a string of text to be lowper")
lower.Parse(os.Args[2:])
fmt.Println(strings.ToLower(*s))
//如果输入其他命令,则输入帮助文档
default :
flag.Usage()
}
}
// D:\Backup\Documents\golang>test
// help
// upercase a string of text to be upper
// lowercase a string of text to be lowper
// D:\Backup\Documents\golang>test 123
// help
// upercase a string of text to be upper
// lowercase a string of text to be lowper
// D:\Backup\Documents\golang>test upercase
// D:\Backup\Documents\golang>test upercase -s
// flag needs an argument: -s
// Usage of upercase:
// -s string
// a string of text to be upper
// D:\Backup\Documents\golang>test upercase -s hello
// HELLO
// D:\Backup\Documents\golang>test lowercase -s HELLO
// hello
安装和分享命令行程序
要让写好的Go工具发挥作用,必须遵循Go语言约定,将代码放在src的目录下,
$GOPATH/src/github.com/your github username
package main
import "fmt"
func main(){
fmt.Println("hello,world")
}
将这个程序放在目录下
$GOPATH/src/github.com/siqu/helloworld
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容