這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
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的定義和初始化
這一篇就先講這麼多,由於精力和時間有限,所以基本是用到什麼寫什麼,不會像很多教程那樣詳細。
有不理解的地方還需自己尋找資料,也可以直接留言大家一起討論。