0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Go 言語を学ぶAdvent Calendar 2023

Day 24

【Go言語】構造体へのメソッド定義

Posted at

Goの構造体メソッドを定義する際の主要なポイントをまとめる。

構造体のメソッド定義

Go言語では、任意の型にメソッド追加が可能である。
構造体メソッドを追加することで、オブジェクト指向言語のクラスに似た振る舞いを実現できる。

サンプル

type Struct struct {
    v int
}

func (s Struct) PrintStatus() {
    log.Println("Struct:", s.v)
}

レシーバーの型

レシーバーの型は値型ポインター型にすることができる。
これによって、メソッド内で構造体の状態を変更できるかどうかが決まる。

サンプル

package main

import (
    "fmt"
)

// 'Person' 構造体を定義。いくつかのフィールドを含む。
type Person struct {
    Name string
    Age  int
}

// 値レシーバーメソッド:元の構造体を変更しない。
func (p Person) Greet() {
    fmt.Println("こんにちは、私の名前は", p.Name, "です。")
}

// ポインターレシーバーメソッド:元の構造体を変更する。
func (p *Person) Birthday() {
    p.Age++
    fmt.Println("お誕生日おめでとう!私は今", p.Age, "歳です。")
}

func main() {
    // Personのインスタンスを作成
    person := Person{Name: "Alice", Age: 30}

    // Greetメソッドを呼び出す - 値レシーバー
    person.Greet()

    // Birthdayメソッドを呼び出す - ポインターレシーバー
    person.Birthday()

    // 更新されたpersonの状態を表示
    fmt.Println("更新されたperson:", person)
}

注意点

  • レシーバーが値型であっても、構造体のフィールドにポインターが含まれている場合、ポインターが指す実体は変更される。
  • レシーバーが値型であっても、構造体のフィールドの値を変更してもエラーにはなりませんが、これは意図しないバグの原因になる可能性がある。

参考

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?