Tambourine作業メモ

主にスキル習得のためにやった作業のメモ。他人には基本的に無用のものです。

Goのチュートリアルをやる(3)

メソッド

メソッドはレシーバーの型を指定した関数。その型を定義したパッケージでしか定義できない。

オブジェクト指向言語だとthisを使うようなところで、レシーバーの仮引数があるのが変わってるかもしれない。

type MyFloat float64

func (f MyFloat) Abs() float64 {
    if f < 0 {
        return float64(-f)
    }
    return float64(f)
}

thisを変更したい場合には、レシーバでポインタを受け取るようにする。

インターフェース

  • Rustでいうところのトレイト。
  • ただし、JavaやRustみたいに型が実装しているかを宣言はしない。ジェネリクスがないから。実装していない型に対して呼んじゃったら単に実行時エラー。
  • 値と型のタプルのように考えればいいらしい・・・どういう意味かよくわからない。
  • 空のインターフェースinterface{}を、Cのvoidのように使える

アサーションは、Cでいうキャスト。

var i interface{} = "hello"
t := i.(string)

とすると、tはstring型になる。

キャストに失敗するとパニックだが、第2の戻り値を取るとパニックにならない。

f := i.(float64) // => panic
f, ok := i.(float64) // 0, false
f, _ = i.(float64) // 0