// getCommands
func getCommands() []cli.Command {
command := cli.Command{
Name: "web",
Usage: "run web server",
Action: runWeb,
Flags: []cli.Flag{
cli.StringFlag{
Name: "host",
Value: "0.0.0.0",
Usage: "bind host",
},
cli.IntFlag{
Name: "port,p",
Value: DefaultPort,
Usage: "bind port",
},
cli.StringFlag{
Name: "env,e",
Value: "prod",
Usage: "runtime environment, dev|test|prod",
},
},
}
return []cli.Command{command}
}
上面那些代码非常不容易理解,我们需要把它拆分来看 当我们直接实例化一个类的时候,如果大括号竖着排,那么里面的成员赋值后要加个逗号
b := Taoshihan{
Name: "taoshihan",
}
fmt.Println(b.Name)
定义一个接口,接口里面有一个成员方法
type Flag interface {
GetName() string
}
定义另一个类型,这个类型刚好就有这个方法,那么就可以认为这个类型实现了接口
type StringFlag struct {
}
func (t StringFlag) GetName() string {
return "taoshihan"
}
这个时候如果定义Flag类型的变量,那么StringFlag也能被赋值过去
var a Flag
a = StringFlag{}
a.GetName()
再回到原代码中的逻辑,如果使用下面这种方式就非常容易理解了
var myflag []Flag
myflag = append(myflag, StringFlag{}, StringFlag{})
command := Command{
Flags: myflag,
}
完整源码:
package main
import "fmt"
type Flag interface {
GetName() string
}
type Command struct {
Flags []Flag
}
type StringFlag struct {
}
func (t StringFlag) GetName() string {
return "taoshihan"
}
type Taoshihan struct {
Name string
}
func main() {
// var a Flag
// a = StringFlag{}
// a.GetName()
// b := Taoshihan{
// Name: "taoshihan",
// }
// fmt.Println(b.Name)
var myflag []Flag
myflag = append(myflag, StringFlag{}, StringFlag{})
command := Command{
Flags: myflag,
}
for _, p := range command.Flags {
fmt.Println(p.GetName())
}
}