🏃‍♂️

[A Tour of Go] Exercise: Fibonacci closure

よくある間違い

最初に 0 が表示されないから間違い

package main

import "fmt"

// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
	first, second := 0, 1

	return func() int {
		first, second = second, first+second
		return first
	}
}

func main() {
	f := fibonacci()
	for i := 0; i < 10; i++ {
		fmt.Println(f())
	}
}

// result
1
1
2
3
5
8
13
21
34
55

正しくはこう

func fibonacci() func() int {
	first, second := 0, 1

	return func() int {
		v := first
		first, second = second, first+second
		return v
	}
}

// result
0
1
1
2
3
5
8
13
21
34

naked return のほうがシンプルかも

func fibonacci() func() int {
	first, second := 0, 1

	return func() (r int) {
		r = first
		first, second = second, first+second
		return
	}
}

この Exercise、closure を理解するのにぴったりだった 😺