カテゴリ: Go言語 更新日: 2025/10/11

Go言語のインターフェースとリフレクションの応用例をわかりやすく解説

Go言語のインターフェースとリフレクションの応用例
Go言語のインターフェースとリフレクションの応用例

先生と生徒の会話形式で理解しよう

生徒

「先生、Go言語で型に依存せずにオブジェクトの情報を調べる方法ってありますか?」

先生

「はい、リフレクションという仕組みを使うと、型や構造体の情報を実行時に確認したり操作したりできます。」

生徒

「インターフェースとリフレクションはどう組み合わせて使うんですか?」

先生

「インターフェースで共通の操作を定義し、リフレクションで実行時に型情報を確認することで、柔軟で安全なコードが書けます。」

1. インターフェースの基本

1. インターフェースの基本
1. インターフェースの基本

Go言語のインターフェースは、異なる型でも同じ操作ができるように抽象化する仕組みです。例えば、犬も猫も「鳴く」という操作がある場合、Speakメソッドを共通に定義できます。


type Speaker interface {
    Speak()
}

type Dog struct{}
type Cat struct{}

func (d Dog) Speak() { fmt.Println("ワンワン") }
func (c Cat) Speak() { fmt.Println("ニャー") }

DogもCatもSpeakerインターフェースとして扱えるので、同じ関数で処理可能です。

2. リフレクションとは?

2. リフレクションとは?
2. リフレクションとは?

リフレクションは、プログラムの実行時に型や構造体の情報を取得したり、値を操作したりする技術です。Goではreflectパッケージを使います。


import "reflect"

func Inspect(i interface{}) {
    t := reflect.TypeOf(i)
    v := reflect.ValueOf(i)
    fmt.Println("型:", t)
    fmt.Println("値:", v)
}

interface{}はすべての型を受け取れる特殊な型です。これを使うと任意の型の情報を調べられます。

3. インターフェースとリフレクションの組み合わせ

3. インターフェースとリフレクションの組み合わせ
3. インターフェースとリフレクションの組み合わせ

インターフェースで抽象化したオブジェクトに対して、リフレクションで型情報を調べると、柔軟かつ安全に処理できます。


func Describe(s Speaker) {
    t := reflect.TypeOf(s)
    fmt.Println("このオブジェクトの型は:", t)
    s.Speak()
}

func main() {
    dog := Dog{}
    cat := Cat{}

    Describe(dog)
    Describe(cat)
}

実行すると、型情報を確認しつつ共通のSpeakメソッドを呼び出せます。

4. リフレクションで構造体のフィールドを操作する

4. リフレクションで構造体のフィールドを操作する
4. リフレクションで構造体のフィールドを操作する

構造体に対してリフレクションを使うと、フィールド名や値を動的に取得・変更できます。これは、設定ファイルやフォームデータの自動処理などに役立ちます。


type Person struct {
    Name string
    Age  int
}

func UpdateField(obj interface{}, fieldName string, newValue interface{}) {
    v := reflect.ValueOf(obj).Elem()
    f := v.FieldByName(fieldName)
    if f.IsValid() && f.CanSet() {
        f.Set(reflect.ValueOf(newValue))
    }
}

func main() {
    p := &Person{Name: "太郎", Age: 20}
    UpdateField(p, "Age", 25)
    fmt.Println(p)
}

この例では、Person構造体のAgeフィールドを動的に変更しています。

5. 実務での応用例

5. 実務での応用例
5. 実務での応用例

インターフェースとリフレクションを組み合わせると、以下のような応用が可能です。

  • 異なる型でも共通の処理を抽象化して実装
  • 構造体のフィールドを自動で設定、ログやJSON出力に活用
  • プラグインや拡張機能の動的読み込み

Go言語のインターフェースで共通の操作を定義し、リフレクションで型情報を確認することで、保守性と柔軟性の高いプログラム設計が可能になります。

カテゴリの一覧へ
新着記事
Go言語の関数でエラーハンドリングする基本的な方法
Go言語のスライス・マップ・配列をまとめて比較してみよう!初心者でもわかる使い分けの基本
Go言語の条件分岐の見やすい書き方を徹底解説!初心者でもわかるif文の使い方
Go言語とは何か?初心者向けに特徴・できること・インストール手順までやさしく解説
人気記事
No.1
Java&Spring記事人気No1
Swift Playgroundの使い方を完全解説!初心者に最適な学習環境の始め方
No.2
Java&Spring記事人気No2
Go言語で条件式を1行で書くコツ!三項演算子の代替と短縮記法
No.3
Java&Spring記事人気No3
Swift開発環境の構築方法を徹底解説!Xcode・Windows・Linux対応
No.4
Java&Spring記事人気No4
Kotlinのデータクラス(data class)とは?便利な特徴と使い方を初心者向けにやさしく解説!