メソッド・コンストラクタ【夏休みにGo vol.20】

こんにちは、しーたです。
今回はメソッドについて学んでいきます。


メソッド

メソッドとは”A.scale(2)”のような書き方で実行できる処理のことです。
これを用いることでオブジェクト指向的に処理を書くことができます。

次の例では"scale()"がメソッドです。
関数名の前に(r *circle)のようにstructを指定することでメソッドを作成することができます。

type circle struct {
	X, Y, R int //中心の座標と半径
}

func getArea(r circle) float64 { //通常の関数
	return 3.14 * 2 * float64(r.R)
}

func (r *circle) scale(i int) { //定数倍するメソッド
	r.X = r.X * i
	r.Y = r.Y * i
	r.R = r.R * i
}

func main() {
	r1 := circle{1, 2, 3}
	fmt.Println(getArea(r1))

	r1.scale(2) //メソッドの実行
	fmt.Println(getArea(r1))
}

画像1



コンストラクタ(structの宣言)

コンストラクタとは「structからインスタンスを生成する処理」です。

下記プログラムではstructであるVector2Dの要素(変数)名を小文字のx,yにしました。こうすることでx,yには同じパッケージ内からしかアクセスができなくなります。※パッケージについては今後詳しくいます。

他のパッケージからVector2Dのインスタンスを生成することを想定して、New()関数を準備する必要があります。

type Vector2D struct {
	x, y int //小文字にする
}

func (v Vector2D) getLength() float64 { //長さを求める
	return math.Sqrt(float64(v.x*v.x + v.y*v.y))
}

func New(x, y int) *Vector2D { //コンストラクタ
	return &Vector2D{x, y}
}

func main() {
	v1 := New(1, 2)
	fmt.Println(*v1)
	fmt.Println(v1.getLength())
}

画像2

※コンストラクタについては私自身まだよく分かっていません。
今後分かれば補足するかもしれません。


以上です。それでは!

いいなと思ったら応援しよう!