😺
Go言語におけるメソッド
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