­

[Go] gocron源碼閱讀-go語言中的切片介面和類型綜合

  • 2019 年 11 月 15 日
  • 筆記
// 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())      }  }