問題
つぎのコードを実行するとどうなるでしょう。
package main
func hello() {
hello := func() {
hello := func() {
print("hello")
}
hello()
}
hello()
}
func main() {
hello := hello
hello()
}
A. hello
と出力される
B. hellohello
と出力される
C. コンパイルエラー
D. 実行時エラー(panic)
解答
正解はAです。 3行目から定義が始まる関数hello(以下hello3)が単純に呼び出されて場合については、昨日の問題と同様です。 この代入が許されるのは、関数名(ここを開いてください
くせものは14行目の変数hello(以下hello14)にhello3を代入しているところですが、これは許されます。つまり15行目で実行されているのはhello14です。FunctionName
) は identifier
であり、identifier
は :=
の右辺にとれるものの一つだからです。
詳しくは仕様の Short variable declarationsとFunction declarationsからたどっていくとよいでしょう。