Menu
Coddy logo textTech

構造体へのメソッド定義

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 を使ってメソッド内で構造体のフィールドにアクセスできます。メソッドは、同じ構造体上の他のメソッドを呼び出すことができます。

challenge icon

チャレンジ

中級

Circle 構造体に3つのメソッドを追加してください:

  • Areamath.Pi * radius * radius を返します
  • Circumference2 * 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())
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン