7.4 使用flag.Value来解析参数

在本节中,我们将看到如何使用另外一个标准接口flag.Value来帮助我们定义命令行标志。考虑如下一个程序,它实现了睡眠指定时间的功能。

在程序进入睡眠前输出了睡眠时长。fmt包调用了time.Duration的String方法,可以按照一个用户友好的方式来输出,而不是输出一个以纳秒为单位的数字。

默认的睡眠时间是1s,但可以用-period命令行标志来控制。flag.Duration函数创建了一个time.Duration类型的标志变量,并且允许用户用一种友好的方式来指定时长,比如可以用String方法对应的记录方法。这种对称的设计提供了一个良好的用户接口。

因为时间长度类的命令行标志广泛应用,所以这个功能内置到了flag包。支持自定义类型其实也不难,只须定义一个满足flag.Value接口的类型,其定义如下所示:

String方法用于格式化标志对应的值,可用于输出命令行帮助消息。由于有了该方法,因此每个flag.Value其实也是fmt.Stringer。Set方法解析了传入的字符串参数并更新标志值。可以认为Set方法是String方法的逆操作,两个方法使用同样的记法规格是一个很好的实践。 ...

Get Go程序设计语言 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.