golangの関数とメソッドの違いとは

Go

この記事を書こうと思った背景は、今まで何となく「関数」「メソッド」という単語を使っていたのですがそれぞれの意味は異なるということを耳にして、きちんと理解して用語を使い分けたいと思ったからです。ではさっそく始めたいと思います。

構文の違い

関数の場合

関数は引数の型をあらかじめ宣言します。次のコードを見てください。

type Person struct {
	Name string
	Age  int
}

func makeNewPerson(name string, age int) *Person {
	return &Person{
		Name: name,
		Age:  age,
	}
}

name、ageとstring型の引数を取ると指定した上で宣言しています。この引数の型をあらかじめ指定するのが関数の特徴です。

メソッドの場合

メソッドの場合はレシーバーと呼ばれるClassのようなデータを引数に取ります。メソッド名の前にレシーバーは定義します。

func (p *Person) isOlder() bool {
	return p.Age > 65
}

これは*Person型でisOlderというメソッドを宣言したことになります。メソッドの特徴はレシーバーを定義することです。

呼び出し方の違い

関数の場合

関数を呼び出す場合は関数名に()をつけて、中に引数を与えるだけです。非常に一般的な方法です。

p := makeNewPerson("katuo", 50)

メソッドの場合

メソッドの場合はメソッド名の前にレシーバーを付与する必要があります。

p := makeNewPerson("katuo", 50)
fmt.Println(p.isOlder()) // false

isOlderメソッドのレシーバーは*Person型でしたのでpを生成した後、pをメソッド名の前に付与して呼び出します。

関数とメソッドは交換可能

関数とメソッドは互換性がある

先程関数とメソッドの特徴について話しましたが、関数をメソッドに、メソッドを関数に変換することができます。次のコードをみてください。

type Persons struct {}

func (*Persons) makeNewPerson(name string, age int) *Person {
	return &Person{
		Name: name,
		Age:  age,
	}
}

func isOlder(p *Person) bool {
	return p.Age > 65
}

persons := &Persons{}
p:= persons.makeNewPerson("katuo",50)
fmt.Println(isOlder(p)) // false

makeNewPerson関数に対してレシーバーを設定することでメソッドに書き換えることができます。isOlderはレシーバー付与するのをやめて、そのレシーバーに与えていた型を引数に与えるように書き換えました。よってisOlderは関数になりました。

14行目でPersonsという構造体を定義します。これはmakeNewPersonメソッドのレシーバーに該当します。そして、makeNewPerson関数はレシーバーとして定義したので15行目のようにメソッド名の前にレシーバーを指定することで呼び出すことができます。pの型は*Person型なのでisOlderに引数として渡すことができます。よってすんなりと関数とメソッドが書き換えられることがわかりました。

メソッドチェーン

メソッドに用意されている構文

メソッドにはメソッドチェーンと呼ばれる、連続してメソッドを呼び出せる仕組みがあります。次のコードを見てください。

package main

import "fmt"

type Person struct {
	Name string
	Age  int
}

func (p *Person) addName(name string) *Person {
	p.Name = name
	return p
}

func (p *Person) addAge(age int) *Person {
	p.Age = age
	return p
}

func main() {
	p := &Person{}

	p = p.addName("katuo").addAge(50) // メソッドチェーン

	fmt.Println(*p) // {katuo 50}
}

addName, addAgeというメソッドを定義した後、23行目でメソッドチェーンを使って1行で2つのメソッドを呼び出せていることがわかります。メソッドチェーンを使うとコードを綺麗に記述することができます。

以上で、関数とメソッドの違いについての記事は終わりです。今回の記事は以下のサイトを参考にしました。

Interfaces in Go (part I)
Interfaces make the code more flexible, scalable and it’s a way to achieve polymorphism in Golang. Instead of requiring a particular type…

番外:おすすめアイテム

記事の内容とは別に自宅・オフィスでの開発がもっと快適に、楽しくなる商品を紹介します。アイテム1つで開発効率が一気に向上したり、開発のモチベーションが上がったりするので良いアイテムにはお金を投資すると良いかと。

KATUO
KATUO
今回紹介する商品は普段自分が使っているものなので自信を持ってお勧めできますー。では1つずつ紹介していきます。

おすすめアイテム①

自分はオフィス次の2点の座布団と背もたれクッションを利用してます。姿勢が安定し、お尻への負担が激減します。オフィスにいるのに自宅で作業しているような感覚になるので気に入ってます。また疲労感もかなり減るので費用対効果が非常に高いアイテムです。

おすすめアイテム②

ブックスタンドみなさん使ってますか?PCを打ちながら参考書見る時に手で抑える必要がなくなるので非常に便利です。自分も購入した時なんでいままで使ってなかたんだろうと後悔したのでまだ持ってない方は買っておくと作業効率があがります。

おすすめアイテム③

PCスタンド、magic keyboard、magic mouseを購入してから、開発効率があがり、身体的負担が減って快適に開発ができるようになりました。

エンジニアの基礎知識・教養

別の記事でエンジニアとして知っておくべき技術本についてまとめました。初心者には最低限読んでおいて欲しい技術本をまとめました。例えば「リーダブルコード」などは技術力の高いエンジニアなら必ず過去に読んでいる本だと思います。

筆者
筆者

今回の記事の内容は以上で終了です!最後まで読んでくれてありがとうございました!Twitterもやってるのでよかったらフォローしてください!

タイトルとURLをコピーしました