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

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. ジェネリクス(型パラメータ)とは?

ジェネリクスは、関数や構造体を特定の型に依存せずに作る方法です。型パラメータを使うことで、同じ処理を整数や文字列などさまざまな型で使えます。


func PrintValue[T any](value T) {
    fmt.Println(value)
}

func main() {
    PrintValue(100)
    PrintValue("こんにちは")
}

ここで、Tは型パラメータで、anyはどんな型でも受け取れることを意味します。

3. インターフェースとジェネリクスの組み合わせ

3. インターフェースとジェネリクスの組み合わせ
3. インターフェースとジェネリクスの組み合わせ

ジェネリクスとインターフェースを組み合わせると、型に依存せずかつ特定の操作を保証する関数や構造体を作れます。


func MakeSpeak[T Speaker](a T) {
    a.Speak()
}

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

    MakeSpeak(dog)
    MakeSpeak(cat)
}

ここでは、TはSpeakerインターフェースを満たす型に限定されるため、必ずSpeakメソッドを持つ型だけが渡せます。

4. ジェネリクスを使った柔軟な構造体設計

4. ジェネリクスを使った柔軟な構造体設計
4. ジェネリクスを使った柔軟な構造体設計

構造体にジェネリクスを使うと、異なる型のデータを持つ構造体を同じ設計で作れます。例えば、異なる型のペットを格納できる構造体です。


type PetBox[T Speaker] struct {
    Pet T
}

func (p PetBox[T]) ShowPet() {
    p.Pet.Speak()
}

func main() {
    dogBox := PetBox[Dog]{Pet: Dog{}}
    catBox := PetBox[Cat]{Pet: Cat{}}

    dogBox.ShowPet()
    catBox.ShowPet()
}

このように、型に依存せず共通の操作を保証できるので、拡張性と安全性の高いコードになります。

5. インターフェースとジェネリクスの使い分け

5. インターフェースとジェネリクスの使い分け
5. インターフェースとジェネリクスの使い分け
  • インターフェースは「操作の共通化」に向いている
  • ジェネリクスは「型の柔軟性」に向いている
  • 組み合わせると、型に依存せず操作も保証される安全なコードが書ける
  • 新しい型を追加しても既存コードを変更せずに対応可能

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)とは?便利な特徴と使い方を初心者向けにやさしく解説!