golangの高階関数の限界に挑戦する

# 追記

ちゃんと呼び出せるように直っとる。Golangえらい。

# 概要

Goで関数を返す関数を返す関数を返す...関数を定義し、無限に呼び出してみる。
想定では基本的に必ず最後まで呼び出せるはずだったが、結果的に途中でエラーになった。

# 序文、及び動機

理屈で言えば高階関数はコールスタックを消費しないので、どこまでも深く定義して呼び出せる。
ただしGolangの場合クロージャになり親の関数内の状態を保存するのでメモリを食うとか何かは起きるであろう。
ということが、なんとなく気になったのでやってみた、という話である。

# やったこと

高階関数自体はワンライナーで生成した。高階関数を呼び出す部分（最下部）は`(A)関数を呼び出して(B)取得した値が関数だったらAに戻る`というコードになっている。

# 結果

OSXの`go version go1.11 darwin/amd64`で試したところ、理由は不明だが100を過ぎたあたりに限界があるらしい。
f101から実行を始めると大丈夫だがf102から実行を始めるとSEGVする。
理由についてはここから先の調べ方がよくわからないのでなんともいえない。
デバッガのdelveで動かすと動いてしまうようなのでGC絡みなのかも？

## 最後まで実行されたときの出力

```
$ go run .
Golang's limit of higher order function
*** f1まで到達した ***
```

## SEGV時の出力

```
$ go run .
Golang's limit of higher order function
unexpected fault address 0xb01dfacedebac1e
fatal error: fault
[signal SIGSEGV: segmentation violation code=0x1 addr=0xb01dfacedebac1e pc=0x10508b9]

goroutine 1 [running]:
runtime.throw(0x1101f7e, 0x5)
        /usr/local/Cellar/go/1.11.1/libexec/src/runtime/panic.go:608 +0x72 fp=0xc000085790 sp=0xc000085760 pc=0x1028152
runtime.sigpanic()
        /usr/local/Cellar/go/1.11.1/libexec/src/runtime/signal_unix.go:397 +0x275 fp=0xc0000857e0 sp=0xc000085790 pc=0x103b1e5
runtime.call32(0xc000062180, 0x11057ca, 0xc00000c368, 0x8)
        /usr/local/Cellar/go/1.11.1/libexec/src/runtime/asm_amd64.s:522 +0x39 fp=0xc000085810 sp=0xc0000857e0 pc=0x10508b9
reflect.Value.call(0x10c3be0, 0xc00000c360, 0x93, 0x1101db4, 0x4, 0xc000085b88, 0x0, 0x0, 0xc00000ad60, 0x1, ...)
        /usr/local/Cellar/go/1.11.1/libexec/src/reflect/value.go:447 +0x449 fp=0xc000085ad8 sp=0xc000085810 pc=0x1094b39
reflect.Value.Call(0x10c3be0, 0xc00000c360, 0x93, 0xc000085b88, 0x0, 0x0, 0xc00000ad60, 0x1, 0x1)
        /usr/local/Cellar/go/1.11.1/libexec/src/reflect/value.go:308 +0xa4 fp=0xc000085b40 sp=0xc000085ad8 pc=0x10945d4
main.main()
        /Users/kuwashima/src/goff/main.go:324 +0x1c4d fp=0xc000085f98 sp=0xc000085b40 pc=0x10b16fd
runtime.main()
        /usr/local/Cellar/go/1.11.1/libexec/src/runtime/proc.go:201 +0x207 fp=0xc000085fe0 sp=0xc000085f98 pc=0x1029ac7
runtime.goexit()
        /usr/local/Cellar/go/1.11.1/libexec/src/runtime/asm_amd64.s:1333 +0x1 fp=0xc000085fe8 sp=0xc000085fe0 pc=0x1052431
exit status 2
```

# コード

シンタックスハイライティングにやたら時間かかるが[The Go Play Space](https://goplay.space/#8diydISS5gc)でも試せる。

コード少し変更した。最後の関数はstring返すように変更。不要な出力を削除。type switch→reflect使うように変更。高階関数多すぎたぶんを削除。

```golang
package main

import (
	"fmt"
	"reflect"
)

func main() {
	fmt.Println("Golang's limit of higher order function")
	f1 := func() string {
		return "*** f1まで到達した ***"
	}
	f2 := func() func() string { return f1 }
	f3 := func() func() func() string { return f2 }
	f4 := func() func() func() func() string { return f3 }
	f5 := func() func() func() func() func() string { return f4 }
	f6 := func() func() func() func() func() func() string { return f5 }
	f7 := func() func() func() func() func() func() func() string { return f6 }
	f8 := func() func() func() func() func() func() func() func() string { return f7 }
	f9 := func() func() func() func() func() func() func() func() func() string { return f8 }
	f10 := func() func() func() func() func() func() func() func() func() func() string { return f9 }
	f11 := func() func() func() func() func() func() func() func() func() func() func() string { return f10 }
	f12 := func() func() func() func() func() func() func() func() func() func() func() func() string { return f11 }
	f13 := func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f12
	}
	f14 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f13
	}
	f15 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f14
	}
	f16 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f15
	}
	f17 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f16
	}
	f18 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f17
	}
	f19 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f18
	}
	f20 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f19
	}
	f21 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f20
	}
	f22 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f21
	}
	f23 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f22
	}
	f24 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f23
	}
	f25 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f24
	}
	f26 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f25
	}
	f27 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f26
	}
	f28 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f27
	}
	f29 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f28
	}
	f30 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f29
	}
	f31 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f30
	}
	f32 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f31
	}
	f33 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f32
	}
	f34 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f33
	}
	f35 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f34
	}
	f36 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f35
	}
	f37 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f36
	}
	f38 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f37
	}
	f39 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f38
	}
	f40 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f39
	}
	f41 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f40
	}
	f42 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f41
	}
	f43 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f42
	}
	f44 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f43
	}
	f45 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f44
	}
	f46 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f45
	}
	f47 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f46
	}
	f48 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f47
	}
	f49 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f48
	}
	f50 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f49
	}
	f51 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f50
	}
	f52 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f51
	}
	f53 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f52
	}
	f54 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f53
	}
	f55 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f54
	}
	f56 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f55
	}
	f57 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f56
	}
	f58 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f57
	}
	f59 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f58
	}
	f60 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f59
	}
	f61 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f60
	}
	f62 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f61
	}
	f63 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f62
	}
	f64 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f63
	}
	f65 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f64
	}
	f66 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f65
	}
	f67 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f66
	}
	f68 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f67
	}
	f69 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f68
	}
	f70 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f69
	}
	f71 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f70
	}
	f72 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f71
	}
	f73 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f72
	}
	f74 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f73
	}
	f75 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f74
	}
	f76 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f75
	}
	f77 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f76
	}
	f78 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f77
	}
	f79 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f78
	}
	f80 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f79
	}
	f81 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f80
	}
	f82 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f81
	}
	f83 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f82
	}
	f84 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f83
	}
	f85 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f84
	}
	f86 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f85
	}
	f87 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f86
	}
	f88 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f87
	}
	f89 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f88
	}
	f90 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f89
	}
	f91 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f90
	}
	f92 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f91
	}
	f93 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f92
	}
	f94 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f93
	}
	f95 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f94
	}
	f96 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f95
	}
	f97 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f96
	}
	f98 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f97
	}
	f99 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f98
	}
	f100 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f99
	}
	f101 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f100
	}
	f102 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f101
	}
	f103 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f102
	}
	f104 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f103
	}
	f105 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f104
	}
	f106 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f105
	}
	f107 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f106
	}
	f108 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f107
	}
	f109 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f108
	}
	f110 := func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() func() string {
		return f109
	}
	fmt.Sprintf("", f110()) //dummy for compile

	fn := reflect.ValueOf(f102)
	for {
		switch fn.Kind() {
		case reflect.Func:
			fn = fn.Call([]reflect.Value{})[0]
		case reflect.String:
			fmt.Println(fn.String())
			return // arrived last function
		default:
			fmt.Printf("%s, %s\n", fn.String(), fn.Kind().String())
			fmt.Println("不明な型なので実行を停止する")
			return
		}
	}
}
```

# （メモ）スタックオーバーフロー時のメッセージ例

スタックオーバーフローのときは以下のようなメッセージになる。

```golang
package main

func stackoverflow() {
	stackoverflow()
}

func main() {
	stackoverflow()
}
```

```
runtime: goroutine stack exceeds 250000000-byte limit fatal error: stack overflow

runtime stack: runtime.throw(0xa0663, 0xe) /usr/local/go/src/runtime/panic.go:608 +0x80 runtime.newstack() /usr/local/go/src/runtime/stack.go:1008 +0x9c0 runtime.morestack() /usr/local/go/src/runtime/asm_amd64p32.s:299 +0xc0
```