TanabataNikki's diary

主に技術的なことを書きます。当面は高校の化学を復習するところからはじめます。

世の中の少し不思議を探してみる

Docker0.10読み(2回目)

Golang Cafe#27に参加してきました。

今日のお題は、Dockerコード読みです。

f:id:TanabataNikki:20140427225050j:plain

~/docker/docker/docker.go のクライアント部分から、~/docker/api/client/commands.goの func CmdRun()を上から読んでいきます。

golang初心者として書き方の勉強になったこと。

 

  • 最初の行で、
config, hostConfig, cmd, err := runconfig.ParseSubcommand(cli.Subcmd("run", "[OPTIONS] IMAGE [COMMAND] [ARG...]", "Run a command in a new container"), args, nil)

変数の型を宣言しないで使っていいこと。このあたりはLLっぽい。

  • エラー処理にはdeferを使う
defer func() {
    if cidFileInfo, err = os.Stat(hostConfig.ContainerIDFile); err != nil {
        return
    }
}()

無名関数なので最後に ()を忘れないこと。deferはいくつでもスタックできる。return時にLIFOで実行される。

  • 並列実行の方法
waitDisplayId = make(chan struct{})
go func() {
    defer close(waitDisplayId)
    fmt.Fprintf(cli.out, "%s\n", runResult.Get("Id"))
}()
  1. チャネル変数(並列動作するプロセス間で使う変数)はmakeで宣言する。
  2. go func() で並列実行する。

このあたりが、golang初心者には、目新しかったです。

 

とりあえず、小並感で。

f:id:TanabataNikki:20140427235340p:plain

ubuntu14.04TLSは2年ぶりということで、こっちも貼っておきます。