はじめに
Golangをちょっと触れてみたので備忘録としての自分用メモ
レシーバとは
Goにはクラスは存在しない。そのためJavaで言うインスタンスメソッドも存在しない。
一方、構造体というものを定義することができ、構造体に対してメソッドを定義することができる。
メソッドは以下の文法で記述される
func (レシーバ 構造体) メソッド名(引数) 返り値
package main
import "fmt"
func main() {
s := Student{"nobita", 60, 60}
fmt.Println(s.name, s.avg()) // nobita 60
}
type Student struct {
name string
math float64
english float64
}
func (s Student) avg() (avgRes float64) {
avgRes = (s.math + s.english) / 2
return
}
値レシーバとポインタレシーバ
端的にまとめると
- 値レシーバ
- レシーバがポインタではない
- メソッド内でレシーバの値を書き換えることができない
- ポインタレシーバ
- レシーバがポインタ
- メソッド内でレシーバの値を書き換えることができる
ポインタレシーバを使ってmath及びenglishの値を書き換えるメソッドcheat
を作ってみる。
package main
import "fmt"
func main() {
s := Student{"nobita", 60, 60}
fmt.Println(s.name, s.avg()) // nobita 60
s.cheat()
fmt.Println(s.name, s.avg()) // nobita 90
}
func (s *Student) cheat() {
s.math += 30
s.english += 30
}