Skip to content

Instantly share code, notes, and snippets.

@mitsugu
Created June 16, 2024 15:32
Show Gist options
  • Save mitsugu/90a15be1339c98912356a3b6c6cd7f78 to your computer and use it in GitHub Desktop.
Save mitsugu/90a15be1339c98912356a3b6c6cd7f78 to your computer and use it in GitHub Desktop.

Go言語におけるレシーバーとは、特定の型に関連付けられた関数を定義するためのメカニズムです。レシーバーを使うことで、その型に対してメソッドを追加できます。これにより、関数がその型の変数と一緒に呼び出され、直感的かつ整理された方法でデータと機能を結びつけることができます。

レシーバーの概要

  1. レシーバーの種類:

    • 値レシーバー: 型の値を受け取ります。関数はその値のコピーを操作します。
    • ポインタレシーバー: 型のポインタを受け取ります。関数はその元の値を直接操作します。
  2. 使い方:

    • レシーバーを使って定義された関数を「メソッド」と呼びます。
    • メソッドは通常の関数と同様に振る舞いますが、レシーバーに指定された型の変数と一緒に呼び出されます。

package main

import (
    "fmt"
)

// 型の定義
type Rectangle struct {
    Width, Height float64
}

// 値レシーバーを使ったメソッドの定義
func (r Rectangle) Area() float64 {
    return r.Width * r.Height
}

// ポインタレシーバーを使ったメソッドの定義
func (r *Rectangle) Scale(factor float64) {
    r.Width *= factor
    r.Height *= factor
}

func main() {
    r := Rectangle{Width: 3, Height: 4}
    
    // メソッドの呼び出し
    fmt.Println("Area:", r.Area()) // 値レシーバーを使用
    r.Scale(2)                     // ポインタレシーバーを使用
    fmt.Println("Scaled Area:", r.Area())
}

まとめ

レシーバーとは、特定の型に関連付けられたメソッドを定義するためのGo言語の構文です。これにより、型に対して直感的に関連する機能を追加し、整理されたコードを書くことができます。値レシーバーはその型の値のコピーを操作し、ポインタレシーバーは元の値を直接操作します。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment