Go言語のメソッドと関数の違いとは?構造体メソッドの仕組みを学ぼう
生徒
「Go言語で“関数”と“メソッド”って出てきましたが、この2つって何が違うんですか?」
先生
「良い疑問ですね!Go言語では“関数”と“メソッド”は似ているようで役割が異なります。具体的にどう違うのか、例を見ながら説明しましょう。」
生徒
「ぜひお願いします!どちらもfuncって書きますよね?」
先生
「その通り。書き方は似ていますが、“メソッド”は構造体とセットで使われる点がポイントです!」
1. Go言語における関数とメソッドの基本
関数は、何かの処理をひとまとめにして実行したいときに使います。たとえば「あいさつする」「計算する」など、決まった手順をひとつの名前にしておくイメージです。Go言語ではfuncというキーワードを使って定義します。
func Hello() {
fmt.Println("こんにちは!")
}
上のように、関数は単独で存在し、誰にも属さないフリーな処理として呼び出すことができます。
それに対して、メソッドは「構造体」とセットで動きます。構造体という“データの入れ物”に対して、「このデータが実行できる処理ですよ」と関連付けられるのがメソッドです。
たとえば「人」という構造体があれば、「自己紹介する」「歩く」といった動作を持たせることができ、コードを読む人にも分かりやすい形になります。関数と比べて、より“そのデータらしい動き”を表現しやすいのが大きな特徴です。
2. 関数の書き方を確認しよう
ここでは、Go言語の関数定義の基本をやさしく整理します。関数はfuncで始まり、「名前」「引数(受け取る値)」「戻り値(返す値)」で構成されます。まずは“何かをする”だけの関数から見ていきましょう。
package main
import "fmt"
// 挨拶するだけの関数(戻り値なし)
func SayHello(name string) {
fmt.Println("こんにちは", name)
}
func main() {
SayHello("太郎")
}
実行結果:
こんにちは 太郎
このように、関数は単独で使えます。SayHelloは「名前という引数」を受け取り、画面にあいさつを表示します。次に、戻り値を返すパターンも確認しましょう。計算結果などを返すときに便利です。
package main
import "fmt"
// 2つの数を足して結果を返す関数(戻り値あり)
func Add(a int, b int) int {
sum := a + b
return sum
}
func main() {
result := Add(2, 3) // 関数の戻り値を受け取る
fmt.Println("合計は", result)
}
実行結果:
合計は 5
ポイントは3つです。①関数名は動作が分かる名前にする、②引数には型を付けて「何を受け取るか」を明確にする、③戻り値がある場合はreturnで結果を返す。これだけで、Go言語の関数の書き方と使い方の基本が身につきます。
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言語ではメソッドは“構造体にひもづいた関数”だと考えるとわかりやすいです。つまり、「構造体が動作を持つ」イメージです。
関数はただの処理、メソッドは“誰がその処理をするか”をはっきりさせたものです。
まとめ
Go言語でプログラムを書いていると、関数とメソッドの名前がよく登場します。それぞれの役割が少し似ているため、最初は違いが分かりにくいと感じる人も多いです。しかし、実際には構造体と結びつくかどうかが大きなポイントになります。関数は単独で動作を定義し、メソッドは構造体とセットで使うことで、そのデータが持つ振る舞いを自然に表現できます。特にオブジェクト指向的な考え方でコードを書くとき、メソッドがあると「このデータはこう動く」という筋の通った書き方ができるようになります。
わかりやすいところとしては、同じfuncで書けるのに、メソッドにはレシーバという特別な書き方を使用する点です。このレシーバがあるおかげで、構造体の値を参照したり変更したりできます。ポインタレシーバを使えば、内部の値を変えながら処理が進むので、「カウントする」「体力を減らす」「スコアを加算する」など、状態が動くプログラムととても相性が良いです。
実際の開発の場面でも、メソッドを使うとソースコードの見通しが良くなることが多いです。関連する処理が構造体の内部にまとまるため、複雑な処理でも読みやすい形に整理できます。小さな学習用プログラムや個人開発でも効果がありますが、複数人で作るプロジェクトでは特に役立ちます。どの構造体がどんな動きを持つのかが理解しやすくなり、後から読んだ人も迷わずに追いかけられるようになります。
さらに、関数はシンプルな処理に向き、多数の場所から呼び出して使うと便利です。一方で、メソッドはその構造体が持つ情報を踏まえて処理できるため、自然な設計につながります。この違いを意識しながら書いていくと、Go言語のコードはより綺麗に整い、読みやすさと管理しやすさがどんどん上がっていきます。
メソッド活用のサンプルコード
例えば、ゲームのキャラクターがレベルアップする動きを考えてみましょう。
// キャラクターの情報を持つ構造体
type Player struct {
Name string
Level int
}
// レベルアップを表すメソッド
func (p *Player) LevelUp() {
p.Level++
fmt.Println(p.Name, "のレベルが", p.Level, "になりました")
}
func main() {
p := Player{Name: "ゆうしゃ", Level: 1}
p.LevelUp()
p.LevelUp()
}
上の例のように、状態を持つ構造体にメソッドを定義すると、まるでキャラクターが生きているかのような振る舞いを表現できます。処理が積み重なっても、データと動きが一緒になっているため、後から読んでも理解しやすい設計になります。 こうした考え方は、Webアプリケーション、スマートフォンアプリ、計算処理、ログ記録など、幅広い場面で役に立ちます。Go言語の構造体とメソッドは、シンプルなのに実践的で、学べば学ぶほど便利さを感じられる組み合わせです。 関数とメソッドの使い分けは、Go言語をしっかり学ぶための大切なテーマです。実際に手を動かしてコードを書いていくことで、自然と感覚が身についていきます。最初は簡単な構造体を作り、あとから少しずつメソッドを増やしていく練習をすると理解しやすくなります。 慣れてきたら、値レシーバとポインタレシーバの違いにも注目してみましょう。値レシーバはデータをそのまま使うとき、ポインタレシーバは状態を変えたいときに役立ちます。状況に応じて使い分けることで、プログラムの完成度がさらに高まります。
生徒
「関数とメソッドの違いがようやく整理できました。構造体と結びつくと動きがはっきりして、読みやすいんですね。」
先生
「その通りです。特に実践的なプログラムでは、メソッドを使うことで“誰が何をするのか”が自然に表現できます。」
生徒
「ポインタレシーバを使うと、構造体の中身が変わる動きになるというのも面白いです。数値の更新や状態管理に活用できそうですね。」
先生
「まさにその用途が多いですね。ボタンのクリック数、ショッピングカートの合計、ゲームの経験値など、現実の動きと似ています。」
生徒
「今度は自分でも構造体を作って、動きのあるメソッドを作ってみます!」
先生
「ぜひ挑戦してください。積み重ねることで、Go言語の書き方が自然と身につきますよ。」
この記事を読んだ人からの質問
プログラミング初心者からのよくある疑問/質問を解決します
Go言語の関数とメソッドの違いがよく分かりません。どっちも同じように見えるのですが、どう使い分けると良いのでしょうか?
Go言語の関数は、単独で処理を実行するための機能です。一方メソッドは構造体と結びつき、その構造体が持つデータを扱うための動作になります。単純な処理なら関数、データと動作をまとめたいときはメソッドを使うと自然で読みやすいプログラムになります。
メソッドは必ず構造体と一緒でなければ使えませんか?
はい。Go言語のメソッドは構造体と結びつく仕組みなので、構造体が存在しないとメソッドとして定義できません。レシーバと呼ばれる書き方で構造体と結びつき、特定のデータに対して動作を追加できます。
【超入門】ゼロから始めるGo言語プログラミング:最速で「動くアプリ」を作るマンツーマン指導
「プログラミングの仕組み」が根本からわかる。Go言語でバックエンド開発の第一歩を。
本講座を受講することで、単なる文法の暗記ではなく、「プログラムがコンピュータの中でどう動いているか」という本質的な理解につながります。シンプルながら強力なGo言語(Golang)を通じて、現代のバックエンドエンジニアに求められる基礎体力を最短距離で身につけます。
具体的な開発内容と環境
【つくるもの】
ターミナル(黒い画面)上で動作する「対話型計算プログラム」や、データを整理して表示する「ミニ・ツール」をゼロから作成します。自分の書いたコードが形になる感動を体験してください。
【開発環境】
プロの現場でシェアNo.1のVisual Studio Code (VS Code)を使用します。インストールから日本語化、Go言語用の拡張機能設定まで、現場基準の環境を一緒に構築します。
この60分で得られる3つの理解
「なぜ動くのか」という設定の仕組みを理解し、今後の独学で詰まらない土台を作ります。
データの種類やメモリの概念など、他言語にも通じるプログラミングの本質を学びます。
ただ動くだけでなく、誰が見ても分かりやすい「綺麗なコード」を書くための考え方を伝授します。
※本講座は、将来的にバックエンドエンジニアやクラウドインフラに興味がある未経験者のためのエントリー講座です。マンツーマン形式により、あなたの理解度に合わせて進行します。
初めてのGo言語を一緒に学びましょう!