はじめに
こんにちは、Stackdriver担当です。Goの make
関数はあらゆるビルトイン型の作成を行う役割を担っているわけですが、諸用でチャネルを作成する際にキャパシティを設定しなかった場合にデフォルト値の0を設定する処理はどこでやってるのかなと思って見てみました。
- 作者: Katherine Cox-Buday,山口能迪
- 出版社/メーカー: オライリージャパン
- 発売日: 2018/10/26
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
TL;DR
- go/chan.go at ae9c822f78d5048aa4290b06a5a38f67aaf23dbe · golang/go · GitHub
go/walk.go at ae9c822f78d5048aa4290b06a5a38f67aaf23dbe · golang/go · GitHub
- go/typecheck.go at ae9c822f78d5048aa4290b06a5a38f67aaf23dbe · golang/go · GitHub
メモ書き
Goのbuiltinは src/builtin/builtin.go
にあると見せかけて、それはgodocのために書いてあるだけのダミー。
実際は src/rumtime
以下と src/cmd/compile/internal/gc
以下に隠されている。
src/runtime/chan.go
には func makechan(t *chantype, size int) *hchan
があり、これが唯一のチャネルを作る関数。したがって、これを呼び出すときにはintの引数が必要になる。
makechan
関数は src/cmd/compile/internal/gc/walk.go
内の func walkexpr(n *Node, init *Nodes) *Node
で構文解析した結果のノードのオペレーターが OMAKECHAN
という識別子になっていた場合に呼ばれている。
OMAKECHAN
はどこで呼ばれているかと言うと、src/cmd/compile/internal/gc/typecheck.go
の func typecheck1(n *Node, top int) *Node
内でやはりオペレーターが OMAKE
だったときに呼ばれていて、かつその引数が TCHAN
(チャネルの識別子)だった場合に呼ばれている。
go/typecheck.go at ae9c822f78d5048aa4290b06a5a38f67aaf23dbe · golang/go · GitHub
case TCHAN
内で i という値は引数の数として i = 1
(=チャネル型を指定しているところ)がまず最低限の数として定義されていて、もしこの他に引数がある(=キャパシティ)の設定がされている場合にはその値を設定している。
で、知りたかった、キャパシティの引数が設定されていない場合は、 n.Left = nodintconst(0)
が設定される。
詳細は省くが nodintconst(0)
は名前の通り 0 というintの値を持ったノードを作って返すので、ここでデフォルト値のキャパシティの0が設定されている、ということでした。