// getCommandsfunc 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 Flaga = StringFlag{}a.GetName()
再回到原代碼中的邏輯,如果使用下面這種方式就非常容易理解了
var myflag []Flagmyflag = append(myflag, StringFlag{}, StringFlag{})command := Command{ Flags: myflag,}
完整原始碼:
package mainimport "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()) }}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/65066.html
標籤:Go
下一篇:GO基礎之檔案操作
