Go言語のメソッドと関数の違いとは?構造体メソッドの仕組みを学ぼう
生徒
「Go言語で“関数”と“メソッド”って出てきましたが、この2つって何が違うんですか?」
先生
「良い疑問ですね!Go言語では“関数”と“メソッド”は似ているようで役割が異なります。具体的にどう違うのか、例を見ながら説明しましょう。」
生徒
「ぜひお願いします!どちらもfuncって書きますよね?」
先生
「その通り。書き方は似ていますが、“メソッド”は構造体とセットで使われる点がポイントです!」
1. Go言語における関数とメソッドの基本
関数は、特定の動作や処理を実行するためのコードのかたまりです。Go言語ではfuncキーワードを使って定義します。
一方、メソッドは構造体と一緒に使うことで、その構造体に特有の動作を定義することができます。
2. 関数の書き方を確認しよう
まずは一般的な関数の書き方から確認してみましょう。
package main
import "fmt"
// 普通の関数
func SayHello(name string) {
fmt.Println("こんにちは", name)
}
func main() {
SayHello("太郎")
}
実行結果:
こんにちは 太郎
このように、関数は単独で使えます。SayHelloという関数を呼び出して、名前を渡してあいさつしています。
3. メソッドの書き方を学ぼう
メソッドは構造体と組み合わせて使うのが特徴です。次の例では、Personという構造体にあいさつのメソッドを定義しています。
package main
import "fmt"
// Person構造体を定義
type Person struct {
Name string
}
// Person型のメソッド
func (p Person) Greet() {
fmt.Println("こんにちは、私は", p.Name, "です")
}
func main() {
p1 := Person{Name: "花子"}
p1.Greet()
}
実行結果:
こんにちは、私は 花子 です
func (p Person)という書き方が“レシーバ”で、これによってこの関数がPerson型のメソッドになります。
4. 関数とメソッドの違いを表で比較
| 項目 | 関数 | メソッド |
|---|---|---|
| 定義の書き方 | func 関数名(...) {...} |
func (レシーバ 型) メソッド名(...) {...} |
| 使い方 | 単独で呼び出す | 構造体の変数に対して呼び出す |
| 構造体との関係 | なし | あり(結びつく) |
5. なぜメソッドを使うのか?
メソッドを使うことで、「この動作はこのデータに関係する」とはっきりわかるようになります。
例えば、人という構造体が「挨拶する」「誕生日を迎える」といった動きを持つことで、オブジェクト指向的なプログラムが書けるようになります。
6. ポインタレシーバを使ったメソッド
メソッドには2つの種類があります。「値レシーバ」と「ポインタレシーバ」です。ポインタレシーバを使うと、構造体の中身を変更することができます。
type Counter struct {
Count int
}
// ポインタレシーバ
func (c *Counter) Increment() {
c.Count++
}
func main() {
c := Counter{Count: 5}
c.Increment()
fmt.Println("カウント:", c.Count)
}
実行結果:
カウント: 6
このように、ポインタレシーバを使うと構造体の値そのものを変更できるので、状態を持つデータとの相性がとても良いです。
7. メソッドは関数の特別バージョン
まとめると、Go言語ではメソッドは“構造体にひもづいた関数”だと考えるとわかりやすいです。つまり、「構造体が動作を持つ」イメージです。
関数はただの処理、メソッドは“誰がその処理をするか”をはっきりさせたものです。