Goでは、メソッドはレシーバーを持つ関数であり、どのタイプのメソッドであるかを示します:
type User struct { Name string } func (u *User) SayHello() { fmt.Println("こんにちは、", u.Name) }
(u *User))は関数の最初の引数として働きますが、構文と呼び出しは異なります。重要! メソッドはパッケージ内で定義された型のみに宣言できます(他のパッケージで定義された型、組み込み型を含むにはメソッドは定義できません)。エイリアス(type alias)の動作は特別です:
type MyInt int)は、メソッドを追加できます。type MyInt = int)にはメソッドを追加できません。なぜなら、これは単なるエイリアスだからです。例:
type MyInt int func (m MyInt) Double() int { return int(m) * 2 } // タイプエイリアス type MyIntAlias = int // func (m MyIntAlias) Double() int { ... } // コンパイルエラー
スライス型 []int またはタイプエイリアスに対してメソッドを宣言できますか?
回答: 組み込み型のスライス([]int)に対してはメソッドを宣言することはできません。新しいユーザー定義型に基づくスライスに対しては、メソッドを追加することができます:
type MySlice []int func (s MySlice) Sum() int { ... } // 許可されている
タイプエイリアスには追加できません:
type SuperSlice = []int // func (s SuperSlice) Sum() int { ... } // エラー
ストーリー
ストーリー
ストーリー
サードパーティパッケージ(例えば、time.Time)の型にメソッドを追加し、日付の操作を標準化しようとしたところ、Goでは不可能であることが判明しました。合成やユーティリティ関数を使用する必要がありました。