Go言語の構造体に絡めて、ここではメソッドを扱います。
Goにおけるメソッドは特定の型に関連付けられた関数です。関数の話題のところで扱っても良かったのですが、構造体での型を関連付けられるわけですから、こちらの構造体を扱って来た流れで扱うことにしました。
メソッドを利用する
先ほども述べましたが、メソッドは特定の型に関連付けられた関数となります。
次のような形でメソッドは定義します。
func (レシーバ 型) 関数名(引数) 戻り値の型 {
処理コード
}
通常の関数定義の関数名の前に、丸括弧でレシーバが記述される形になります。この型に関連づけられて処理する関数というです。
具体的なコードで見ていきましょう。
package main
import "fmt"
type character struct {
name string
yearOfBirth int
birthPlace string
}
type performance struct {
character
drama string
}
func (p performance) profile() {
fmt.Println(p.name, "\n出生年:", p.yearOfBirth, "\n出身地:", p.birthPlace, "\n出演ドラマ:", p.drama)
}
func main() {
p1 := performance{
character: character{
"新垣結衣",
1988,
"沖縄県",
},
drama: "逃げるは恥だが役に立つ",
}
p2 := performance{
character: character{
"本田翼",
1992,
"東京都",
},
drama: "ラジエーションハウス",
}
fmt.Println(p1)
fmt.Println(p2)
p1.profile()
p2.profile()
}
ここでは、typeで型を2つ定義しています。
character型とperformance型を定義しています。character型がperformance型に埋め込まれた形になっています。ここは構造体の埋め込みの復習です。
このperformance型にprofile()関数を関連づける形でメソッドを定義しています。ここではレシーバをpとして、全てのフィールドにドットでアクセスしている処理を記述しています。
main()関数の中で、データを渡して2つの構造体を作っています。この構造体をメソッドとして関連づけるわけです。
この構造体をPrintln()で出力する処理と、メソッドとして、変数にドットでアクセスしているものを呼び出す処理をしています。
実行すると出力は次のようになります。
{{新垣結衣 1988 沖縄県} 逃げるは恥だが役に立つ}
{{本田翼 1992 東京都} ラジエーションハウス}
新垣結衣
出生年: 1988
出身地: 沖縄県
出演ドラマ: 逃げるは恥だが役に立つ
本田翼
出生年: 1992
出身地: 東京都
出演ドラマ: ラジエーションハウス
構造体の出力部分と、メソッドの出力部分との違いが理解できると思います。
最後に
ここでは、Go言語のメソッドについて扱いました。
メソッドは特定の型に関連付けられた関数で、この型に構造体で定義した型を関連づけます。
func (レシーバ 型) 関数名() 戻り値の型 { 処理 } という形で定義します。
構造体を変数に当てはめ、これをレシーバとして、関数にアクセスしてメソッドを実行することになります。