Golang 关键字
- var和const :变量和常量的声明
- go : 用于并行
go 关键字用来创建 goroutine (协程),是实现并发的关键。
1 2 3 4 5 6 7 8 9 10 11
| //go 关键字放在方法调用前新建一个 goroutine 并让他执行方法体 go GetThingDone(param1, param2);
//上例的变种,新建一个匿名方法并执行 go func(param1, param2) { }(val1, val2)
//直接新建一个 goroutine 并在 goroutine 中执行代码块 go { //do someting... }
|
Golang flag 解析入参
flag 是 go 标准库提供的解析命令行参数的包。
使用 flag.String(), Bool(), Int() 等函数注册 flag
1 2 3 4 5 6 7 8 9
| import "flag"
var ip = flag.Int("flagname", 1234, "help message for flagname")
var flagvar int func () { flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname") }
|
自定义 flag
需要实现 flag.Value
interface:
1 2 3 4
| type Value interface { String() string Set(string) error }
|
Example
1 2 3 4 5 6 7 8 9 10 11 12
| type percentage float32 func (p *percentage) Set(s string) error { v, err := strconv.ParseFloat(s, 32) *p = percentage(v) return err } func (p *percentage) String() string { return fmt.Sprintf("%f", *p) } 大专栏 Golangs="line"> var pop percentage flag.Var(&pop, "pop", "popularity")
|
在注册完成之后,最后调用 flag.Parse()
命令行
1 2 3
| -flag -flag=x -flag x // 只有非bool类型的flag可以
|
可以使用1个或2个’-‘号,效果是一样的。最后一种格式不能用于 bool 类型的 flag。
来个简单的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| package main import ( "fmt" "flag" )
func main(){ data_path := flag.String("D","/home/manu/sample/","DB data path") log_file := flag.String("l","/home/manu/sample.log","log file") nowait_flag :=flag.Bool("W",false,"do not wait until operation completes")
flag.Parse()
var cmd string = flag.Arg(0);
fmt.Printf("action : %sn",cmd) fmt.Printf("data path: %sn",*data_path) fmt.Printf("log file : %sn",*log_file) fmt.Printf("nowait : %vn",*nowait_flag)
fmt.Printf("-------------------------------------------------------n")
fmt.Printf("there are %d non-flag input paramn", flag.NArg()) for i,param := range flag.Args() { fmt.Printf("#%d :%sn",i,param) } }
|
参考资料