Go言語(golang)のメソッド(method)
メソッドの使い方を説明します。Tour of Goを参考にしています。
Go言語(golang)のメソッドの使い方
Go言語(Golang)のメソッドは、特定の型に関連付けられた関数のことです。これにより、その型のインスタンスに対して操作を行うための関数を定義できます。メソッドは、オブジェクト指向プログラミングの概念を持っていますが、Goではクラスの概念がないため、型にメソッドを関連付けることでオブジェクト指向の概念を実現しています。
以下に、簡単な例を挙げて、Go言語のメソッドをわかりやすく説明します。
package main
import "fmt"
// Person型の定義
type Person struct {
FirstName string
LastName string
}
// Person型に紐づくメソッドの定義
func (p Person) FullName() string {
return p.FirstName + " " + p.LastName
}
func main() {
// Person型のインスタンスの生成
person := Person{
FirstName: "John",
LastName: "Doe",
}
// メソッドの呼び出し
fullName := person.FullName()
// 結果の表示
fmt.Println("Full Name:", fullName)
}
この例では、Person
という型を定義し、その型にFullName
というメソッドを関連付けています。FullName
メソッドはPerson
型のインスタンスに対して呼び出すことができ、そのインスタンスのFirstName
とLastName
を結合してフルネームを返します。
main
関数では、Person
型のインスタンスを作成し、FullName
メソッドを呼び出しています。これにより、フルネームが表示されます。
要点
- メソッドは関数のように見えますが、特定の型に紐づいています。
- メソッドの宣言では、関数名の前にメソッドが関連付けられる型(ここでは
Person
)とその型のインスタンスが引数として渡されるための名前(ここではp
)が指定されます。 - メソッドの本体では、
p
を通じてPerson
型のフィールドにアクセスできます。
Go言語(golang)のメソッドのポイントレシーバと値レシーバ
ポインタレシーバと値レシーバの違い
Goでは、メソッドのレシーバ(メソッドが関連付けられる型)は、値レシーバまたはポインタレシーバのどちらかとして指定できます。値レシーバを使用すると、メソッド内でレシーバのコピーが作成され、ポインタレシーバを使用すると、レシーバ自体が変更される可能性があります。適切な選択は、メソッドがオブジェクトのコピーを変更する必要があるかどうかに依存します。
ポインタレシーバと値レシーバの使い分け
メソッドがオブジェクトの状態を変更する必要がある場合は、ポインタレシーバを使用します。
メソッドがオブジェクトの状態を変更しない場合は、値レシーバを使用します。
ポインタレシーバの利点
ポインタレシーバを使用すると、メソッドがオブジェクトの状態を変更できます。これにより、メモリ効率が向上し、コピーが不要になります。
Go言語(golang)のtypeにメソッド宣言
例で挙げたstructの型だけではなく、任意の型(type)にもメソッドを宣言できます。
package main
import (
"fmt"
"math"
)
type MyFloat float64
func (f MyFloat) Abs() float64 {
if f < 0 {
return float64(-f)
}
return float64(f)
}
func main() {
f := MyFloat(-math.Sqrt2)
fmt.Println(f.Abs())
}