如何在Go中使用Flag包
引言
命令行实用工具很少能在没有额外配置的情况下开箱即用。好的默认值很重要,但有用的工具需要接受用户的配置。在大多数平台上,命令行实用程序接受标志来定制命令的执行。标志是添加在命令名称之后的键值分隔的字符串。Go允许你使用标准库中的flag
包来构建接受标志的命令行实用程序。
在本教程中,你将探索使用flag
包构建不同类型的命令行实用程序的各种方法。你将使用一个标志来控制程序输出,引入位置参数来混合标志和其他数据,然后实现子命令。
使用标志来改变程序的行为
使用flag
包涉及三个步骤:首先,[定义变量]以捕获标志值,然后定义您的Go应用程序将使用的标志,最后,在执行时解析提供给应用程序的标志。flag
包中的大多数函数都是定义标志并将它们绑定到你已经定义的变量。解析阶段由Parse()
函数处理。
为了说明这一点,我们将创建一个程序,它定义一个[Boolean]标志,改变打印为标准输出的消息。如果提供了-color
标志,程序将打印一条蓝色的消息。如果没有提供标志,消息将不带任何颜色地打印。
创建一个名为boolean.go
的新文件:
nano boolean.go
在该文件中添加以下代码来创建该程序:
boolean.go
package main
import (
"flag"
"fmt"
)
type Color string
const (
ColorBlack Color = "\u001b[30m"
ColorRed = "\u001b[31m"
ColorGreen = "\u001b[32m"
ColorYellow = "\u001b[33m"
ColorBlue = "\u001b[34m"
ColorReset = "\u001b[0m"
)
func colorize(color Color, message string) {
fmt.Println(string(color), message, string(ColorReset))
}
func main() {
useColor := flag.Bool("color", false, "display colorized output")
flag.Parse()
if *useColor {
colorize(ColorBlue, "Hello, DigitalOcean!")
return
}
fmt.Println("Hello, DigitalOcean!")
}
这个例子使用ANSI转义序列来指示终端显示彩色输出。这些是特殊的字符序列,因此为它们定义一个新类型是有意义的。在这个例子中,我们将该类型命名为Color
,并将其定义为string
。然后我们在接下来的const
块中定义一个颜色调色板。在const
代码块之后定义的colorize
函数接受其中一个Color
常量和一个string
变量来对消息进行着色。它通过首先打印所要求的颜色的转义序列来指示终端改变颜色,然后打印消息,最后通过打印特殊的颜色重置序列来请求终端重置其颜色。
在main
中,我们使用flag.Bool
函数来定义一个名为color
的布尔值标志。该函数的第二个参数false
用于在未提供此标志时设置其默认值。与你的预期相反,将其设置为true
并不会使行为发生反转,即提供一个标志会导致它变为false。因此,这个参数的值几乎总是false
,带有布尔值标志。
最后一个参数是一个文档字符串,可以作为使用消息打印出来。这个函数返回的值是一个指向bool
的指针。下一行的flag.Parse
函数使用此指针根据用户传递的标志设置bool
变量。然后我们可以通过解引指针来检查这个bool
指针的值。关于指针变量的更多信息可以在[指针教程]中找到。使用这个布尔值,我们可以在设置-color
标志时调用colorize
,并在标志不存在时调用fmt.Println
变量。
保存文件,不带任何标志地运行程序:
go run boolean
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!