zoukankan      html  css  js  c++  java
  • 102

    main函数在哪里?

    看到这个go文件时大家是不是有一种找到入口的欣喜,同时有一种难以言表的郁闷,为什么那么短?获取一个command,然后执行一个Execute()就运行了?好像是这么回事,然后点开了Execute()方法:

    越往下看越郁闷,咋那么难。。。

    这时候看一下我们在哪里,可以发现当前路径是:

    D:/go/src/k8s.io/kubernetes/vendor/github.com/spf13/cobra/command.go:790

    尴尬,一开始就陷入了3方库。点开NewSchedulerCommand()函数看看呢:

    到这里好像我们发现了什么,cobra是个什么东西?似乎cobra影响了整个代码结构,获取command是cobra的Command对象,最后的Execute()方法也是cobra提供的方法。于是不难发现,这是一个绕不过去的三方库,我们得先花点力气查查cobra是什么!

    cobra是什么?

    我们可以在github上看到这个项目

    来自spf13,看来是精品!上图的英文介绍里可以看到一点消息:A Commander for modern Go CLI interactions

    然后浏览一下README.md(建议大家到github上认真看一下这个说明文档),我们大致可以看出来

    天哪,那么多知名开源go项目,k8s生态的etcd、docker、之上的openshift等等居然都用了cobra!明显这些项目都用了cobra当做“脚手架”,也就是入口风格会很像!spf13写的pflag等都是大名鼎鼎的轮子中的精品啊,看来cobra很值得稍微深入一下,如果自己开发命令行工具,需要用到子命令和flag的话,spf13的cobra和pflag是不二之选了。

    一句话介绍cobra,然后我们简单实践一下:支持子命令行模式和复杂flag的时髦命令行程序脚手架!

    cobra程序长什么样?

    要写个demo,当然得先install cobra. 作为一只gopher,我相信大家install 一个github上的go项目是没有压力的,此中无非可能遇到网络问题,go get不行就git clone,缺啥找啥,最终下载完是这样的:

    下面我们试着写一个小小的cobra程序:

    如上命令,cobra告诉我们application is ready at xxx,所以我们看一下本地生成了些什么:

    本地自动创建好了一个项目,我们看一下main.go里面是什么:

    是不是有点小激动?和kube-scheduler的入口一样一样的!我们运行如下命令来添加2个command:

    我们打开version.go稍微修改一下:

    发现没有,当我们执行一个命令时,对应的command中Run方法会被执行!我们最后看一个子命令的玩法:

    怎么样,轻轻松松写了一个支持多级命令的程序,后面一张图可以看到上面我们输入命令中serverCmd的含义:

    下面看kube-scheduler中对应的Run在哪里?

    cmd/kube-scheduler/app/server.go:322 func NewSchedulerCommand() *cobra.Command

    继续看一下Run:后面是什么:

    这个Run()方法继续跟一下:

    是不是发现好像接近真相了?

    这个server.Run()我们继续看看:

    太和谐了!这个注释也可以直观看到这就是运行SchedulerServer的入口,这个函数接收到stop信息前会一直运行下去,也就是一直运行着的kube-scheduler!!!

    我们最后回头看一下main.go

    是不是很好理解了?第一个红框中设置Run()方法中需要做什么,后面的Execute()方法其实就是运行了前面定义的Run()方法!

    今天就讲到这里,我们下一讲寻找调度算法!

     
     
     

  • 相关阅读:
    Elasticsearch之下载源码
    Elasticsearch之settings和mappings(图文详解)
    Editplus下载、安装并最佳配色方案(强烈推荐)
    在CentOS下安装tomcat并配置环境变量(改默认端口8080为8081)
    Elasticsearch之中文分词器插件es-ik的自定义热更新词库
    Elasticsearch之中文分词器插件es-ik的自定义词库
    Elasticsearch之IKAnalyzer的过滤停止词
    md5增加指定的加密规则,进行加密
    unity中怎样获取全部子物体的组件
    Plus One
  • 原文地址:https://www.cnblogs.com/cloudgeek/p/9941345.html
Copyright © 2011-2022 走看看