本文へスキップ
BecomeCoder

Goコース · 第5章 構造体・メソッド・インターフェース · レッスン18

メソッド ― 型に振る舞いを持たせる

ブラウザで完結

導入

構造体(データ)に「その型のための関数」を結びつけたものが メソッド です。「User の自己紹介」のように、データと振る舞いをまとめられます。

説明

package main

import "fmt"

type User struct {
    Name string
    Age  int
}

// User 型に対する Greet メソッド
func (u User) Greet() string {
    return fmt.Sprintf("%s%d歳)です", u.Name, u.Age)
}

func main() {
    u := User{Name: "鈴木", Age: 25}
    fmt.Println(u.Greet()) // 鈴木(25歳)です
}
  • func (u User) Greet() stringfunc と関数名の間にある (u User)レシーバ。「この関数は User 型のメソッドですよ」という指定です。
  • メソッドの中では、レシーバ u を通じてフィールド(u.Name)を使えます。
  • 呼び出しは u.Greet() のように、値.メソッド名() の形です。

値を書き換えるメソッドを作りたいときは、レシーバをポインタ(*User)にします。

func (u *User) Birthday() {
    u.Age++ // 元の値を実際に増やす
}

*User(ポインタレシーバ)にすると、メソッドの中での変更が呼び出し元にも反映されます。

やってみよう

Greet の中の書式を変えれば、自己紹介の文面を変えられます。Birthday() を呼ぶと Age が1増える点も、値レシーバ(User)とポインタレシーバ(*User)の違いとして押さえておきましょう。

実際に動かしてみよう

下のエディタにGoを書いて「実行」を押すと、学習用シミュレータが fmt の出力を表示します(本物のGoコンパイラではなく、教材の範囲を再現した軽量エンジンです)。スライス・マップ・構造体・インターフェース・goroutine/channel なども動きます。本文の例を書き換えて動かしてみましょう(並行処理の実行順は決定的に再現しているため、本物のインターリーブとは異なる場合があります)。

Go — ブラウザ内で実行(学習用シミュレータ)

Goの教材サブセットを動かす学習用シミュレータを読み込みます(本物のGoコンパイラではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。