😺

Go言語におけるメソッド

2024/04/20に公開

1,そもそも関数とメソッドとは?

まず、メソッドとは、関数の一つである。
すごく簡単に説明すると、関数とメソッドの違いは、
・構造体や特定の型に紐付けられているのが、メソッド。
・引数にて値を渡すのが関数、レシーバにて値を渡すのがメソッド。
である。
これだけだと分かりづらいので、具体的に記述していく。

2,関数とメソッドの具体例

まずは一般的な関数から、

main.go
//構造体の定義
type Number struct {
	X, Y int
}

//関数の定義
func Function(n Number) int {
	return n.X + n.Y
}

func main() {
	//変数定義
	n := Number{2, 2}
	//出力
	fmt.Println(Function(n)) //4
}

続いて、メソッド

main.go
//構造体の定義
type Number struct {
	X, Y int
}

//メソッドの定義
func (n Number) Method() int {
	return n.X + n.Y
}

func main() {
	//変数の定義
	n := Number{2, 2}
	//出力
	fmt.Println(n.Method())
}

3,ポインタレシーバの使い方

レシーバにポインタを用いると、参照渡しができる。
ポインタを用いなければ、値渡しになる。

main.go
//構造体の定義
type Number struct {
	X, Y int
}

//メソッド01の定義
func (n Number) Method01() int {
	return n.X + n.Y
}

//メソッド02の定義
func (n *Number) Method02(f int) {
	n.X = n.X * f
	n.Y = n.Y * f
}

func main() {
	//変数の定義
	n := Number{2, 3}
	//メソッド02の実行(ポインタを用いない場合、n.X,n.Yの値は参照渡しではなく、値渡しになる)
	n.Method02(2)
	//メソッド01の出力
	fmt.Println(n.Method01())
}

4,ポインタを引数に使う場合

main.go
//構造体の定義
type Number struct {
	X, Y int
}

//メソッドの定義(ポインタ使用)
func (n *Number) Method(f int) {
	n.X = n.X * f
	n.Y = n.Y * f
}

//関数の定義(引数にポインタの使用)
func Function(n *Number, f int) {
	n.X = n.X * f
	n.Y = n.Y * f
}

func main() {
	//変数の定義
	n := Number{1, 2}
	n.Method(2)
	//出力
	fmt.Println(n.X, n.Y) //2 4
	
	//引数をポインタにて参照渡し
	Function(&n, 3)
	//出力
	fmt.Println(n.X, n.Y) //6 12
}

5,ポインタを用い、メソッドを再利用する

type Number struct {
X, Y int
}

func (n Number) Method() int {
return n.X + n.Y
}
func Function(n Number) int {
return n.X + n.Y
}

func main() {
//値を直接持つ変数
n := Number{1, 2}
fmt.Println(n.Method())
fmt.Println(Function(n))

//ポインタを持つ変数を定義し、メソッドの再利用
p := &Number{2, 3}
fmt.Println(p.Method())
fmt.Println(Function(*p))

}

Discussion