Go 言語で構造体にメソッドを追加する

Go 言語で構造体にメソッドを追加する

Go 言語では構造体を宣言して、その構造体に対してメソッドを定義することができます。

まず構造体を定義します。

type foo struct {
  s string
  t string
}

上記で定義した構造体はfoo型です。foo型の変数を宣言します。

p := foo{"aaa", "bbb"} // pはfoo型の構造体の変数
p := foo{s:"aaa", t:"bbb"} // pはfoo型の構造体の変数(key-valueで宣言するパターン)

この構造体にメソッドを追加します。

// 構造体にメソッドを追加
func (f foo) greeting(str string) {
  fmt.Printf("%s , %s\n", str, f.s)
}

構造体のメソッドは以下のように記述します。引数、戻り値はなければ省略可能です。

func (レシーバ名 レシーバ型) メソッド名(引数) 戻り値 {
  // 処理
}

構造体のメソッドは実は2種類あります。一つは上記のような値メソッドと呼ばれるメソッドで、もう一つはポインタメソッドと呼ばれるメソッドです。上記のメソッドをポインタメソッドに変更するには、レシーバ型を以下のように記述します。

// 構造体にポインタメソッドを追加(*をつける)
func (f *foo) greeting(str string) {
  fmt.Printf("%s , %s\n", str, f.s)
}

ポインタメソッドの特徴は、構造体の変数を変更することができることです。

以下は構造体の変数を変更している例です。

package main

import (
  "fmt"
)

type foo struct {
  s string
  t string
}

func main() {
  p := foo{s: "aaa", t: "bbb"} // pは構造体
  fmt.Println(p.s) // aaa
  fmt.Println(p.t) // bbb
  p.greeting() // ここで構造体の値を変更する
  fmt.Println(p.s) // xxx
}

// ポインタメソッドの場合は、構造体の値を変更することができる
func (f *foo) greeting() {
  f.s = "xxx"
}

Go 言語で構造体にメソッドを追加する

コメント

タイトルとURLをコピーしました