zoukankan      html  css  js  c++  java
  • [Go] gocron源码阅读-go语言中的切片接口和类型综合

    // 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())
        }
    }
  • 相关阅读:
    思维导图
    网络面经
    2.17 C++ 专项练习 错题复盘
    C++面经
    2.15 C++专项练习 错题复盘
    uboot下读取flash,上传tftp服务器、下载
    Hi3516EV100烧录出厂固件
    用Hi3518EV200板当spi烧录器
    生而为人,我很抱歉!深夜爬虫, 我很抱歉 ,附微信 “ 网抑云” 公众号爬虫教程!
    阿里HR: 你会 Android 实现侧滑菜单-design吗? CN看了,原来这么简单呀!
  • 原文地址:https://www.cnblogs.com/taoshihan/p/11863563.html
Copyright © 2011-2022 走看看