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())
        }
    }
  • 相关阅读:
    洛谷 P2048 [NOI2010]超级钢琴(优先队列,RMQ)
    洛谷P1074 靶形数独(跳舞链)
    洛谷P1337 [JSOI2004]平衡点 / 吊打XXX(模拟退火)
    洛谷P4003 无限之环(费用流)
    洛谷P3264 [JLOI2015]管道连接(斯坦纳树)
    洛谷P3190 [HNOI2007]神奇游乐园(插头dp)
    洛谷P3272 [SCOI2011]地板(插头dp)
    常用的端口配置
    Win7+Eclipse+Hadoop2.6.4开发环境搭建
    Windows10+eclipse+hadoop2.7.1环境配置+wordcount-折腾笔记
  • 原文地址:https://www.cnblogs.com/taoshihan/p/11863563.html
Copyright © 2011-2022 走看看