構造体へのメソッド定義
CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 7/107。
Goのメソッドは、関数を構造体型に関連付ける特殊なレシーバ引数を持つ関数です。
メソッド構文
func (receiverName StructType) MethodName() ReturnType {
// メソッドの本体
}メソッドを持つ構造体を定義します
type Rectangle struct {
Width float64
Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
func (r Rectangle) Perimeter() float64 {
return 2 * (r.Width + r.Height)
}引数を持つメソッド
func (r Rectangle) Scale(factor float64) float64 {
return r.Area() * factor
}メソッドの呼び出し
rect := Rectangle{Width: 5, Height: 3}
fmt.Println(rect.Area()) // 出力: 15
fmt.Println(rect.Perimeter()) // 出力: 16
fmt.Println(rect.Scale(2)) // 出力: 30レシーバ (r Rectangle) を使用すると、レシーバ変数 r を使ってメソッド内で構造体のフィールドにアクセスできます。メソッドは、同じ構造体上の他のメソッドを呼び出すことができます。
チャレンジ
中級Circle 構造体に3つのメソッドを追加してください:
Area—math.Pi * radius * radiusを返しますCircumference—2 * math.Pi * radiusを返しますDescribe— 文字列"Circle with radius X.XX"を返します
チートシート
Goのメソッドは、関数を構造体型に関連付ける特別なレシーバ引数を持つ関数です。
メソッドの構文:
func (receiverName StructType) MethodName() ReturnType {
// メソッドの本体
}構造体とメソッドの例:
type Rectangle struct {
Width float64
Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
func (r Rectangle) Perimeter() float64 {
return 2 * (r.Width + r.Height)
}メソッドはパラメータを受け取ることができます:
func (r Rectangle) Scale(factor float64) float64 {
return r.Area() * factor
}メソッドの呼び出し:
rect := Rectangle{Width: 5, Height: 3}
fmt.Println(rect.Area()) // 出力: 15
fmt.Println(rect.Perimeter()) // 出力: 16
fmt.Println(rect.Scale(2)) // 出力: 30レシーバを使用すると、メソッド内で構造体のフィールドにアクセスできます。メソッドは、同じ構造体上の他のメソッドを呼び出すことができます。
自分で試してみよう
package main
import "fmt"
func main() {
var radius float64
fmt.Scan(&radius)
c := Circle{Radius: radius}
fmt.Printf("Area: %.2f\n", c.Area())
fmt.Printf("Circumference: %.2f\n", c.Circumference())
fmt.Printf("Description: %s\n", c.Describe())
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
1Go オブジェクト指向の基礎
外部ファイルGo ワークスペースとモジュールパッケージとインポート公開された名前と非公開の名前Go におけるオブジェクト指向入門クラスとしての構造体構造体へのメソッド定義ポインタレシーバと値レシーバ構造体の初期化コンストラクタ関数まとめ:簡易計算機8エラー処理とOOP
error インターフェースカスタムエラー型エラーラッピング (fmt.Errorf)センチネルエラーerrors.Is() と errors.As()Panic、Defer、Recover復習 - ファイルパーサー