メソッド #
メソッドを定義する #
package main
import (
"fmt"
)
type S struct{}
func (s *S) M() {
fmt.Println("Hello World")
}
func main() {
s := new(S)
s.M() // == Hello World
}
継承したメソッドを実行する #
Go 言語には継承はないので、構造体の埋め込みと移譲を使うことで他の構造体のメソッドを使うことできる。
package main
import (
"fmt"
)
type S1 struct{}
func (s *S1) M() string {
return "from S1.M"
}
type S2 struct {
// *S1 を埋め込む
*S1
}
func main() {
s := new(S2)
// S2 に M メソッドはないが、S1 を埋め込んであるので処理が移譲されて S1.M が実行される
fmt.Println(s.M()) // == from S1.M
}
継承したメソッドをオーバーライドする #
Go 言語には継承はないので、構造体の埋め込みと移譲を使うことで他の構造体のメソッドを使うことでき、埋め込んだ構造体と同名のメソッドを定義することで上書きすることができる。
package main
import (
"fmt"
)
type S1 struct{}
func (s *S1) M() string {
return "from S1.M"
}
type S2 struct {
*S1
}
func (s *S2) M() string {
return "from S2.M"
}
func main() {
s := new(S2)
// 埋め込んでいる S1 にも M メソッドはあるが、S2 に定義されている M が優先して実行される
fmt.Println(s.M()) // == from S2.M
}