メソッド
メソッドはレシーバーの型を指定した関数。その型を定義したパッケージでしか定義できない。
オブジェクト指向言語だと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