缘起
我一直在想,有什么方式可以让人比较轻易地保持每日学习,持续输出的状态。写博客是一种方式,但不是每天都有想写的,值得写的东西。有时候一个技术比较复杂,写博客的时候经常会写着写着发现自己的理解有偏差,或者细节还没有完全掌握,要去查资料,了解了之后又继续写,如此反复。这样会导致一篇博客的耗时过长。
我在每天浏览思否、掘金和Github的过程中,发现一些比较好的想法,有JS 每日一题,NodeJS 每日一库,每天一道面试题等等等等。https://github.com/parro-it/awesome-micro-npm-packages这个仓库收集 NodeJS 小型库,一天看一个不是梦!这也是我这个系列的灵感。我计划每天学习一个 Go 语言的库,输出一篇介绍型的博文。每天一库当然是理想状态,我心中的预期是一周 3-5 个。
今天是第一天,我们从一个基础库聊起————Go 标准库中的flag
。
简介
flag
用于解析命令行选项。有过类 Unix 系统使用经验的童鞋对命令行选项应该不陌生。例如命令ls -al
列出当前目录下所有文件和目录的详细信息,其中-al
就是命令行选项。
命令行选项在实际开发中很常用,特别是在写工具的时候。
- 指定配置文件的路径,如
redis-server ./redis.conf
以当前目录下的配置文件redis.conf
启动 Redis 服务器; - 自定义某些参数,如
python -m SimpleHTTPServer 8080
启动一个 HTTP 服务器,监听 8080 端口。如果不指定,则默认监听 8000 端口。
快速使用
学习一个库的第一步当然是使用它。我们先看看flag
库的基本使用:
package main
import (
"fmt"
"flag"
)
var (
intflag int
boolflag bool
stringflag string
)
func init() {
flag.IntVar(&intflag, "intflag", 0, "int flag value")
flag.BoolVar(&boolflag, "boolflag", false, "bool flag value")
flag.StringVar(&stringflag, "stringflag", "default", "string flag value")
}
func main() {
flag.Parse()
fmt.Println("int flag:", intflag)
fmt.Println("bool flag:", boolflag)
fmt.Println("string flag:", stringflag)
}
可以先编译程序,然后运行(我使用的是 Win10 Git Bash):
$ go build -o main.exe main.go
$ ./main.exe -intflag 12 -boolflag 1 -stringflag test
输出:
int flag: 12
bool flag: true
string flag: test
如果不设置某个选项,相应变量会取默认值:
$ ./main.exe -intflag 12 -boolflag 1
输出:
int flag: 12
bool flag: true
string flag: default
可以看到没有设置的选项stringflag
为默认值default
。
还可以直接使用go run
,这个命令会先编译程序生成可执行文件,然后执行该文件,将命令行中的其它选项传给这个程序。
$ go run main.go -intflag 12 -boolflag 1
可以使用-h
显示选项帮助信息:
$ ./main.exe -h
Usage of D:\code\golang\src\github.com\darjun\cmd\flag\main.exe:
-boolflag
bool flag value
-intflag int
int flag value
-stringflag str