kingbosster 发表于 2015-4-18 06:16:27

[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 mapRepository
sync.Mutex
// FIXME: move push/pull-related fields
// to a helper type
pullingPool mapchan struct{}
pushingPool mapchan struct{}
}
  定义一个类型名为TagStore的结构。



    store := &TagStore{
path:         abspath,
graph:      graph,
Repositories: make(mapRepository),
pullingPool:make(mapchan struct{}),
pushingPool:make(mapchan struct{}),
}
  声明并定义( 使用 ":=" )了一个类型为TagStore的变量,变量名为store。
  
  回顾:
  1. 讲解了函数的定义
  2. 讲解了struct的定义和初始化
  
  这一篇就先讲这么多,由于精力和时间有限,所以基本是用到什么写什么,不会像很多教程那样详细。
  有不理解的地方还需自己查找资料,也可以直接留言大家一起讨论。
页: [1]
查看完整版本: [Go语言]从Docker源码学习Go——结构和函数的定义