[Go语言]从Docker源码学习Go——结构和函数的定义

Docker在最近很火,而作为Docker的开发语言-Go也再次被大家提到。

已经使用Docker一段时间了,但是对于源码,尤其是其开发语言Go却一直是一知半解。

最近准备利用空余时间从Docker源代码入手来学习一下Go,同时对Docker的实现也希望可以提高一个层次。

有兴趣的可以一起讨论,学习。

准备工作:

1. Docker源代码https://github.com/docker/docker (版本1.1.2)

2. 安装开发工具LiteIDE, 这个是官方的Go语言的IDE

3. Go语言的官网http://golang.org/ (现在这个已经被墙了,如果想访问的话,可以通过vpn或者goagent来实现,网上可以搜到很多关于goagent的配置,这就不细说了)

Docker命令

Docker pull xxx  //下载image的命令。

对应的go文件

docker/graph/pull.go

讲解代码

import (
    ...

    "github.com/docker/docker/engine"
    ...
)

func (s *TagStore) CmdPull(job *engine.Job) engine.Status {

(s *TagStore)  这个的意思是说对类型TagStore定义一个方法,名称为CmdPull

job *engine.Job  是方法的输入参数,类型为engine.Job

engine.Status  是方法的返回参数,类型为engine.Status

上面设计到3种类型,但是TagStore直接使用,而Job和Status通过engine.的方式来获得,为什么呢?

因为TagStore和当前的方法处于同一package下,都是package graph

而Job和Status处于package engine下(docker/engine/job.go),所以带有包名,而且需要通过import引入对应的文件

TagStore这个结构的定义(docker/graph/tags.go)

type TagStore struct {
    path         string
    graph        *Graph
    Repositories map[string]Repository
    sync.Mutex
    // FIXME: move push/pull-related fields
    // to a helper type
    pullingPool map[string]chan struct{}
    pushingPool map[string]chan struct{}
}

定义一个类型名为TagStore的结构。

    store := &TagStore{
        path:         abspath,
        graph:        graph,
        Repositories: make(map[string]Repository),
        pullingPool:  make(map[string]chan struct{}),
        pushingPool:  make(map[string]chan struct{}),
    }

声明并定义( 使用 ":=" )了一个类型为TagStore的变量,变量名为store。

回顾:

1. 讲解了函数的定义

2. 讲解了struct的定义和初始化

这一篇就先讲这么多,由于精力和时间有限,所以基本是用到什么写什么,不会像很多教程那样详细。

有不理解的地方还需自己查找资料,也可以直接留言大家一起讨论。

[Go语言]从Docker源码学习Go——结构和函数的定义,布布扣,bubuko.com

时间: 2024-08-08 16:44:43

[Go语言]从Docker源码学习Go——结构和函数的定义的相关文章

[Go语言]从Docker源码学习Go——init()方法和identifier首字母大小写区分

init()方法 如果想在一个go文件里,进行一些初始化的工作,可以把代码放到init()方法中. init()方法先被执行. func init() { // initialization of package } 注意:它是没有输入参数和返回参数的. identifier首字母大小写区分 当identifier(比如constant,variable,type,function,struct field,...)的命名首字母是大写的话,那表示这个identifier在包外是可以见的: 类似p

[Go语言]从Docker源码学习Go——main函数

Go程序从main包下的main函数开始执行,当main执行结束后,程序退出. Docker的main函数在 docker/docker/docker.go package main //Import needed packages; import ( ... "github.com/docker/docker/api" ... ) //define const; const ( defaultCaFile = "ca.pem" defaultKeyFile = &

[Go语言]从Docker源码学习Go——指针和Structs

这两天在看reflect这个包在Docker中的使用时,遇到了各种问题,最后虽然知道怎么用了. 但是对于这块的原理还不是太懂,于是把"THE WAY TO GO"中关键的几章看了下. 继续坚持往下写,争取能说明白. 源码 还是先看Docker中源码, docker/api/client/cli.go type DockerCli struct { proto string addr string configFile *registry.ConfigFile in io.ReadClo

[Go语言]从Docker源码学习Go——if语句和map结构

if语句 继续看docker.go文件的main函数 if reexec.Init() { return } go语言的if不需要像其它语言那样必须加括号,而且,可以在判断以前,增加赋值语句 语法 IfStmt = "if" [ SimpleStmt ";" ] Expression Block [ "else" ( IfStmt | Block ) ] . 例子 if x := f(); x < y { return x } else i

[Go语言]从Docker源码学习Go——function和method

function和method关系 method是针对某一类型定义的function, function可以单独调用,method必须针对某一类型的实例进行调用 //function 调用方式 packageName.FuncName() //method 调用方式 var t packageName.Type t.MethodName() 源码 func (cli *DockerCli) LoadConfigFile() (err error) { cli.configFile, err =

[Go语言]从Docker源码学习Go——Interfaces

Interface定义: type Namer interface { Method1(param_list) return_type Method2(param_list) return_type ... } 注: 1. interface中不能包含变量 2. 一个类型不用显式去定义实现某个接口,只要包含所有interface中定义的方法,这个类型就默认实现了这个接口 3. 多个类型可以实现相同的接口 4. 一个类型实现接口的同时,还可以定义属于自己的方法 5. 一个类型可以实现多个接口 嵌套

[Android FrameWork 6.0源码学习] ViewGroup的addView函数分析

Android中整个的View的组装是采用组合模式. ViewGroup就相当与树根,各种Layout就相当于枝干,各种子View,就相当于树叶. 至于View类.我们就当它是个种子吧.哈哈! ViewGroup属于树根,可以生长数很多枝干(继承自定义Layout)而枝干上有可以长出很多叶子(TextView,ImageVIew......) 好,闲话少叙,接下来步入正题! 首先,关于View的操作方法,被定义在一个叫做ViewManager的接口中,接口中还有两个方法,分别是移除和更新,这次主

Docker源码分析(一):Docker架构

[编者按]在<深入浅出Docker>系列文章的基础上,InfoQ推出了<Docker源码分析>系列文章.<深入浅出Docker>系列文章更多的是从使用角度出发,帮助读者了解Docker的来龙去脉,而<Docker源码分析>系列文章通过分析解读Docker源码,来让读者了解Docker的内部实现,以更好的使用Docker.总之,我们的目标是促进Docker在国内的发展以及传播.另外,欢迎加入InfoQ Docker技术交流群,QQ群号:272489193. 1

Docker源码分析(三):Docker Daemon启动

1 前言 Docker诞生以来,便引领了轻量级虚拟化容器领域的技术热潮.在这一潮流下,Google.IBM.Redhat等业界翘楚纷纷加入Docker阵营.虽然目前Docker仍然主要基于Linux平台,但是Microsoft却多次宣布对Docker的支持,从先前宣布的Azure支持Docker与Kubernetes,到如今宣布的下一代Windows Server原生态支持Docker.Microsoft的这一系列举措多少喻示着向Linux世界的妥协,当然这也不得不让世人对Docker的巨大影响