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())
        }
    }
  • 相关阅读:
    Delphi命名规则
    highcharts 折线,饼状,条状综合图
    Highcharts创建一个简单的柱状图
    创建一个简单的WCF程序
    VS快捷键大全
    2021.05.28 手写简易web服务器
    2021.05.23 春眠不觉晓,optional知多少……
    springboot整合ActiveMQ实现异步交易
    安利一款云容器管理工具portainer……
    uglifyjs压缩js文件(指令压缩/ 批量压缩/ 编程方式压缩)
  • 原文地址:https://www.cnblogs.com/taoshihan/p/11863563.html
Copyright © 2011-2022 走看看