Slide 1

Slide 1 text

Goでのレシーバとnilの関係 2019-07-26 Umeda.go 2019 Summer Kentaro Kawano

Slide 2

Slide 2 text

レシーバとは • メソッド呼び出しの対象 • 値レシーバ • ポインタレシーバ

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

レシーバがnilのメソッド呼び出しはpanicになる?

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

必ずpanicになるとは限らない レシーバがnilのメソッド呼び出しはpanicになる?

Slide 7

Slide 7 text

メソッド式 • RecieverType.MethodName での呼び出しが可能 • user.SayHi() は (*User).SayHi(user) と同じ • レシーバはメソッド式の第⼀引数になる

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

どんな時にpanicする?

Slide 10

Slide 10 text

間接参照するとき • ポインタ型の変数(値はnil)に対して • フィールドを参照するとき • 値レシーバが必要なメソッドを呼び出すとき • 変数はレシーバの型に応じて⾃動的に型が変換される

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

ダメな実装例

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

⼤事なところではnilチェックをちゃんとしよう

Slide 16

Slide 16 text

まとめ • レシーバには値レシーバとポインタレシーバがある • レシーバはメソッド式の第⼀引数 • レシーバがnilでもpanicしないケースがある • ポインタレシーバを利⽤する場合にはnilチェックする • すべてのメソッドでチェックする必要はない(経験則