🗜️

Go言語の構造体型に定義されたメソッドを使う

2023/07/14に公開

Go by Example: Methods

公式を翻訳しています
Goは構造体型に定義されたメソッドをサポートしている。

このエリア・メソッドは、レシーバー・タイプが*rectである。

メソッドは、ポインター・レシーバー型とバリュー・レシーバー型のどちらにも定義できる。以下に値レシーバーの例を示す。

ここでは、構造体に対して定義された2つのメソッドを呼び出します。

Goは、メソッド呼び出しに対する値とポインタの変換を自動的に処理します。メソッド呼び出し時のコピーを回避したり、メソッドで受信構造体を変異させたりするために、ポインタ受信型を使用したい場合があります。

次に、関連するメソッド群をグループ化して名前をつけるGoのメカニズム、インターフェイスについて見ていこう。

package main

import "fmt"
// rectは、幅と高さを持つ構造体です。
type rect struct {
    width, height int
}
// このメソッドは、*rect型のレシーバである。
// レシーバーとは、funcキーワードとメソッド名の間に自身の引数リストを伴う型を宣言することで、
func (r *rect) area() int {
    return r.width * r.height
}
// このメソッドは、rect型のレシーバである。
func (r rect) perim() int {
    return 2*r.width + 2*r.height
}

func main() {
    // Goは、メソッドを呼び出すとき、自動的に値とポインタ間を変換する。
    r := rect{width: 10, height: 5}
    // メソッドを呼び出すとき、Goは自動的に値とポインタ間を変換する。
    fmt.Println("area: ", r.area())
    // ポインタレシーバを持つメソッドは、レシーバが指す変数を変更できる。
    fmt.Println("perim:", r.perim())
    // ポインタレシーバを持つメソッドを呼び出すとき、Goは自動的にポインタを渡す。
    rp := &r
    // ポインタレシーバを持つメソッドは、レシーバが指す変数を変更できる。
    fmt.Println("area: ", rp.area())
    // ポインタレシーバを持つメソッドを呼び出すとき、Goは自動的にポインタを渡す。
    fmt.Println("perim:", rp.perim())
}

実行結果

hashimotojunichi@hashimotojunichinoMacBook-Pro go-example % go run hello.go
area:  50
perim: 30
area:  50
perim: 30

まとめ

今回もまたポインターを使ってみました。なんでログの結果が、30になるのかいまだにわからない?
Github Copilotによると、3倍にしているかららしい?

Jboy王国メディア

Discussion