17.使用命令行程序

操作输入和输出

名称 代码 描述
标准输入 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:如果有分析错误,就退出并将状态码设置为2
  • flag.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
喜欢就支持以下吧
点赞0
分享
评论 抢沙发
四曲的头像-四曲博客

昵称

取消
昵称表情代码图片