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

Go言語の構造体でポリモーフィズム的な設計をする基本例

Go言語の構造体でポリモーフィズム的な設計をする基本例
Go言語の構造体でポリモーフィズム的な設計をする基本例

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

生徒

「Go言語ってオブジェクト指向ができないって聞いたけど、ポリモーフィズムみたいなことはできないんですか?」

先生

「Go言語では、クラスという考え方はありませんが、構造体(struct)とインターフェース(interface)を使って、ポリモーフィズム的な設計ができますよ。」

生徒

「どういうことですか?簡単な例で教えてください!」

先生

「それでは、構造体とインターフェースを使って、動物たちが鳴くプログラムを作ってみましょう!」

1. ポリモーフィズムとは何か?

1. ポリモーフィズムとは何か?
1. ポリモーフィズムとは何か?

まず「ポリモーフィズム」という言葉の意味を簡単に説明します。日本語では「多態性」と訳されます。これは、同じ操作でも、対象によって異なる動作をすることを指します。

例えば「鳴く」という命令があったとき、犬なら「ワン」、猫なら「ニャー」と鳴くような違いです。

2. 構造体とインターフェースで表現する

2. 構造体とインターフェースで表現する
2. 構造体とインターフェースで表現する

Go言語では「構造体」でデータを定義し、「インターフェース」で動作(メソッド)をまとめます。これによって、ポリモーフィズム的な設計が実現できます。


type Animal interface {
    Speak() string
}

type Dog struct {}
func (d Dog) Speak() string {
    return "ワンワン"
}

type Cat struct {}
func (c Cat) Speak() string {
    return "ニャー"
}

ここでは、Animalというインターフェースを定義し、DogCatという構造体が、それぞれSpeak()メソッドを持っています。

3. インターフェース型の変数に代入する

3. インターフェース型の変数に代入する
3. インターフェース型の変数に代入する

それぞれの動物をAnimal型の変数に代入することで、共通の操作ができるようになります。


func main() {
    var a Animal

    a = Dog{}
    fmt.Println(a.Speak()) // ワンワン

    a = Cat{}
    fmt.Println(a.Speak()) // ニャー
}

a.Speak()という同じ命令でも、代入されている動物によって違う動作になります。これがポリモーフィズムの基本的な考え方です。

4. 配列やスライスで複数の動物を扱う

4. 配列やスライスで複数の動物を扱う
4. 配列やスライスで複数の動物を扱う

インターフェース型のスライスを使うと、異なる種類の構造体を一緒に扱えます。


func main() {
    animals := []Animal{Dog{}, Cat{}}

    for _, a := range animals {
        fmt.Println(a.Speak())
    }
}

このようにして、違う種類の動物が混在するスライスでも、Speak()メソッドを共通して使うことができます。

5. インターフェースを使うメリット

5. インターフェースを使うメリット
5. インターフェースを使うメリット

構造体だけを使っていると、種類ごとに別々のコードを書かなければならなくなります。インターフェースを使うことで、共通の型として扱えるようになり、コードの再利用性が高まり、柔軟な設計ができるようになります。

Go言語では「型の共有」よりも「振る舞いの共有」を重視して設計されています。そのため、クラスは無くても、構造体とインターフェースを使ってオブジェクト指向的な考え方が実現できるのです。

Go言語を基礎からスッキリ学びたい人や、 文法だけでなく「実用的な使い方」まで押さえたい人には、 定番の入門書がこちらです。

基礎からわかるGo言語をAmazonで見る

※ Amazon広告リンク

まとめ

まとめ
まとめ

Go言語の構造体インターフェースを使い、ポリモーフィズム的な設計を行う方法を学んできました。クラスが存在しないGo言語でも、構造体にメソッドを定義し、インターフェースによって共通の振る舞いをまとめることで、多態性を自然に表現できるという特徴は、Goの設計思想の中でも非常に重要なポイントです。今回の記事では、犬と猫がそれぞれ異なる声で鳴くという、初心者でも理解しやすい例を通して、同じ命令でも実際の動作が変わる仕組みについて深く掘り下げました。 ポリモーフィズムは、オブジェクト指向の中核的な考え方であり、複数の型が同じインターフェースを実装することで、共通の操作を統一的に扱えるようになります。Goではクラスを使わない代わりに、構造体とインターフェースを組み合わせることで、柔軟で拡張性の高いプログラムを作ることができます。これにより、新たな種類の動物を追加したい場合も、構造体にメソッドを実装するだけで既存のコードに自然に組み込むことが可能です。 さらに、インターフェース型のスライスを使うことで、異なる種類の構造体を一つの集合として扱い、ループでまとめて処理する設計も非常に便利です。こうした書き方に慣れると、大規模なプログラムで多くの型を扱う場合でも、コードの見通しが良くなり、保守性が飛躍的に向上します。 また、インターフェースの導入によって、コードの依存関係を減らし、テストしやすい設計ができる点も実務で評価されるポイントです。動物が鳴くという例は身近ですが、実際にはログの出力形式を変えたり、複数のデータ保存先を切り替えたりする場面で、この考え方がそのまま活用されます。 以下では、記事の内容を発展させたサンプルコードを掲載し、より深い理解につながるよう、複数の構造体を追加したバージョンも紹介します。インターフェースの使い方や、ポリモーフィズムの効果を確認しながら、自分のプロジェクトにも応用できるよう意識して読み進めてください。

ポリモーフィズム応用サンプルコード


package main

import "fmt"

// インターフェース定義
type Animal interface {
    Speak() string
}

// 構造体ごとの実装
type Dog struct {}
func (d Dog) Speak() string { return "ワンワン" }

type Cat struct {}
func (c Cat) Speak() string { return "ニャー" }

type Bird struct {}
func (b Bird) Speak() string { return "チュンチュン" }

// Animal を受け取って動作させる関数
func makeSound(a Animal) {
    fmt.Println("鳴き声:", a.Speak())
}

func main() {
    animals := []Animal{Dog{}, Cat{}, Bird{}}

    for _, a := range animals {
        makeSound(a)
    }
}

このサンプルでは、犬・猫・鳥の3種類の構造体にそれぞれSpeak()を実装しています。インターフェースAnimalを満たす構造体であれば、どの種類の動物が来てもmakeSound()関数で処理できる点が、ポリモーフィズムの大きな強みです。 実際の業務では、複数の異なる種別を扱うプログラムは非常に多く、Goのインターフェースはその柔軟性を最大限に生かせる仕組みとなっています。今後Goで開発を進める際には、構造体とインターフェースの設計をセットで考える習慣を身につけておくと、より直感的で応用力のあるコードが書けるようになります。

先生と生徒の振り返り会話

生徒

「構造体とインターフェースだけで、こんなにオブジェクト指向っぽい書き方ができるなんて驚きました!」

先生

「Goはシンプルな言語ですが、インターフェースを使うことで複雑な設計にも対応できるんですよ。特にポリモーフィズムは実務で本当によく使われます。」

生徒

「たしかに、動物を追加するのも簡単で、スライスに入れるだけで同じように扱えるのが便利ですね。」

先生

「そうそう。新しい種類の機能を追加したいときも、構造体を1つ増やしてインターフェースを実装するだけで済むので、変更に強い設計になるんです。」

生徒

「Goはクラスがないって聞いて不安でしたが、今回の仕組みを知ったら逆にスッキリしてて好きかもしれません!」

関連セミナーのご案内

【超入門】ゼロから始めるGo言語プログラミング:最速で「動くアプリ」を作るマンツーマン指導

「プログラミングの仕組み」が根本からわかる。Go言語でバックエンド開発の第一歩を。

本講座を受講することで、単なる文法の暗記ではなく、「プログラムがコンピュータの中でどう動いているか」という本質的な理解につながります。シンプルながら強力なGo言語(Golang)を通じて、現代のバックエンドエンジニアに求められる基礎体力を最短距離で身につけます。

具体的な開発内容と環境

【つくるもの】
ターミナル(黒い画面)上で動作する「対話型計算プログラム」や、データを整理して表示する「ミニ・ツール」をゼロから作成します。自分の書いたコードが形になる感動を体験してください。

【開発環境】
プロの現場でシェアNo.1のVisual Studio Code (VS Code)を使用します。インストールから日本語化、Go言語用の拡張機能設定まで、現場基準の環境を一緒に構築します。

この60分で得られる3つの理解

1. 環境構築の完全な理解

「なぜ動くのか」という設定の仕組みを理解し、今後の独学で詰まらない土台を作ります。

2. Go言語の基本構造(変数・型)

データの種類やメモリの概念など、他言語にも通じるプログラミングの本質を学びます。

3. 読みやすいコードの書き方

ただ動くだけでなく、誰が見ても分かりやすい「綺麗なコード」を書くための考え方を伝授します。

※本講座は、将来的にバックエンドエンジニアクラウドインフラに興味がある未経験者のためのエントリー講座です。マンツーマン形式により、あなたの理解度に合わせて進行します。

セミナー画像

初めてのGo言語を一緒に学びましょう!

関連記事:
カテゴリの一覧へ
新着記事
New1
Go言語
Go言語のwhile的なforループの使い方!条件式ループの基本を解説
New2
Go言語
Go言語プログラムの実行方法まとめ!VSCode・ターミナルでの実行手順を解説
New3
Swift
Swift意味とは?プログラミング言語・金融・鳥の違いを徹底解説
New4
Swift
Swift 戻り値の扱い方と複数戻り値の返し方|初心者でも分かる関数の基本
人気記事
No.1
Java&Spring記事人気No1
Go言語
Go言語でリダイレクト処理を行う方法(http.Redirect)を初心者向けに解説
No.2
Java&Spring記事人気No2
Swift
Swift開発環境の構築方法を徹底解説!Xcode・Windows・Linux対応
No.3
Java&Spring記事人気No3
Kotlin
Android Studioのインストール手順と初期設定を初心者向けに完全解説!
No.4
Java&Spring記事人気No4
Go言語
Go言語のgo.modファイル完全ガイド!初心者でもわかる仕組みと書き方
No.5
Java&Spring記事人気No5
Kotlin
Gradleファイル(build.gradle.kts)の書き方と役割をやさしく解説!Kotlin初心者向け完全ガイド
No.6
Java&Spring記事人気No6
Go言語
Go言語で条件式を1行で書くコツ!三項演算子の代替と短縮記法
No.7
Java&Spring記事人気No7
Swift
Swift Playgroundの使い方を完全解説!初心者に最適な学習環境の始め方
No.8
Java&Spring記事人気No8
Kotlin
Kotlinの演算子一覧と使い方!算術・比較・論理演算子の基本を解説