1. 默认情况下,我们可以让命令源码文件接受哪些类型的参数值?
答:前面讲过`flag`是专门用来处理命令行参数的包,所以我们只需要看`flag`这个包支持哪些数据结构就行了。结果如下:
* int(int|int64|uint|uint64),
* float(float|float64)
* string,
* bool,
* time.duration(时间),
* var(自定义,如FlagSet、Flag、实现Value接口等)
2. 我们可以把自定义的数据类型作为参数值的类型吗?如果可以,怎样做?
答:显然是可以的,从上面的回答来看就知道可以。实现方式可以参考源码中`flag.CommandLine.Var(value Value,name string,usage string)`的实现,核心在于自定义的数据类型需要实现`Value`接口,只要实现了`Value`接口,这个问题也就解决了。
1. 目录结构
* rexlin600(我的`GOPATH`)
* pkg
* bin
* src
* flagfunc
* custom_type.go
* tflag.go
* main
* main.go
2. 编写`main.go`和`tflag.go`以及自定义的`custom_type.go`
`main.go`
```
package main
import (
"flagfunc"
"fmt"
)
// main method
func main() {
fmt.Println("==> hello,", flagfunc.CustomFlag)
}
```
`tflag.go`
```
package flagfunc
import (
"flag"
"fmt"
)
var CustomFlag customFlag
// 测试自定义数据类型flag
func TestCustomFlag() {
fmt.Println("==> package flagfunc")
// custom define Value
flag.CommandLine.Var(&CustomFlag, "custom", "custom define test")
// After all flags are defined, call flag.Parse() to parse the command line into the defined flags.
flag.Parse()
}
```
`custom_type.go`
```
package flagfunc
import (
"strings"
)
type customFlag string
func newStringValue(val string, p *string) *customFlag {
*p = val
return (*customFlag)(p)
}
func (a *customFlag) Set(str string) error {
str = strings.TrimSpace(str)
*a = customFlag(str)
return nil
}
func (a *customFlag) String() string { return "" }
```
3. 测试:进入main.go所在路径,输入命令`go run main.go custom="{"\"rexlin600\"",18,"\"3072@qq.com\""}"`即可
展开