メソッド

メソッド #

メソッドを定義する #

package main

import (
	"fmt"
)

type S struct{}

func (s *S) M() {
	fmt.Println("Hello World")
}

func main() {
	s := new(S)
	s.M() // == Hello World
}
play_circleRun open_in_newRun In The Playground

継承したメソッドを実行する #

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
}
play_circleRun open_in_newRun In The Playground

継承したメソッドをオーバーライドする #

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
}
play_circleRun open_in_newRun In The Playground