A Tour of Go42~54学習メモ

  • Goの関数はクロージャ
  • クロージャとはそれ自身の外部から変数を参照する関数の値
  • 43での実装例はadder関数がクロージャを返していて、sum変数が関数に関連づけられて保持されている
  • switch文でcaseの最後で自動的にbreakする
  • breakせずに通したい場合はfallthrough文をcaseの最後に記述(defaultでは書かない)
  • メソッドはレシーバ(structで定義される)と関連付けた関数
  • 他のパッケージからの型や基本型にはメソッドが定義できない
  • インターフェース型はメソッド群で定義される
  • 54はおそらく明示的にどのインターフェースを持っているか書かなくて良くて定義されているインターフェースのように振る舞えるということ(Javaみたいにclassにimplementsしなくて良いみたいな?)

うーん。暗黙的なインターフェースのところが理解できてるか自信ないな。

A Tour of Go44の解答

package main

import "fmt"

// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func(i int) int {
    j, k := 0, 1
    return func(i int) int {
        switch i {
        case 0:
            return 0
        case 1:
            return 1
        default:
            j, k = k, j + k
            return k
        }
    }
}

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

switch文使ったり、引数にループ変数渡したりしちゃいましたけど実装できました。