[Go] gocron源码阅读-go语言中的切片接口和类型综合
2023-02-18 15:41:49 时间
// 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()) } }
相关文章
- 【已解决】Windows系统使用WSL安装的Linux系统怎么设置root密码
- php大小写转换
- php如何在某个时间上加一天?一小时? 时间加减
- php字符串比较
- PHP中include()与require()
- php实现网站访客数量统计的方法(简单实现,不能防刷新)
- PHP循环输出二维数组的数据
- PHP统计当前在线用户数实例
- PHP 的 UNICODE 编码和解码
- PHP100上的图片上传程序
- PHP GD库
- 详解:macOS/Linux如何挂载磁盘?如何开机自动挂载/卸载磁盘?
- Windows Server 2008 R2x64 IIS7+PHP5.6 错误 500.0
- PHP实现微信公众号企业号自定义菜单接口示例
- PHP过滤html注释
- PHP库存管理系统的设计之词汇恶补
- JQ + PHP + TrackMore物流信息跟踪
- 入门级 – 码云(Gitee),GitHub 教程
- git 删除某次指定的提交
- Linux – 查看用户列表