カテゴリ: Go言語 更新日: 2026/03/09

Go言語の依存性逆転原則(DI)の基本と実装例をやさしく解説!初心者向けアーキテクチャ入門

Go言語の依存性逆転原則(DI)の基本と実装例
Go言語の依存性逆転原則(DI)の基本と実装例

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

生徒

「Go言語でアプリを作るとき、設計ってどう考えればいいんですか?」

先生

「Go言語では、依存性逆転原則やDIという考え方を使うと、保守しやすい設計ができます。」

生徒

「依存性逆転原則ってむずかしそうです。初心者でもわかりますか?」

先生

「大丈夫です。身近なたとえを使いながら、Go言語のコード例つきで説明します。」

1. 依存性逆転原則とは何か

1. 依存性逆転原則とは何か
1. 依存性逆転原則とは何か

Go言語のアーキテクチャ設計で重要な考え方の一つが依存性逆転原則です。依存とは、ある機能が別の機能に頼っている状態をいいます。たとえば、注文処理がデータベースに直接つながっている状態です。

依存性逆転原則では、具体的な処理に直接つながるのではなく、抽象という共通の約束を間にはさみます。抽象とは、細かい実装を決めないで、やることだけを決めた設計図のようなものです。

これにより、上の層の処理が下の層の細かい実装に振り回されなくなります。Go言語ではこの抽象をインターフェースで表現します。

2. DIとは何か

2. DIとは何か
2. DIとは何か

DIは依存性注入と呼ばれます。注入とは、外から渡すという意味です。自分で必要な部品を作るのではなく、外から受け取る設計にします。

たとえば電化製品に電池を入れる場面を考えます。本体の中で電池を作るのではなく、外から電池を入れます。これが依存性注入のイメージです。

Go言語では、構造体にインターフェース型のフィールドを持たせ、外から実装を渡すことでDIを実現します。これによりテストや差し替えが簡単になります。

3. 依存している悪い例

3. 依存している悪い例
3. 依存している悪い例

まずは依存が強いコード例を見てみます。サービスが直接具体的な構造体を使っています。


package main

import "fmt"

type MySQL struct{}

func (m MySQL) Save(data string) {
    fmt.Println("MySQLに保存:", data)
}

type UserService struct {
    db MySQL
}

func (u UserService) Register(name string) {
    u.db.Save(name)
}

func main() {
    service := UserService{db: MySQL{}}
    service.Register("Taro")
}

この設計では、UserServiceがMySQLに強く依存しています。別のデータベースに変更するとき、コードを大きく書き換える必要があります。

4. インターフェースで抽象化する

4. インターフェースで抽象化する
4. インターフェースで抽象化する

次に、Go言語のインターフェースを使って抽象化します。インターフェースは、どんな処理を持つかだけを決める型です。


package main

import "fmt"

type Database interface {
    Save(data string)
}

type MySQL struct{}

func (m MySQL) Save(data string) {
    fmt.Println("MySQLに保存:", data)
}

ここではDatabaseというインターフェースを定義しました。Saveという動きを持つことだけを約束しています。具体的にどう保存するかは決めていません。

5. DIを使った実装例

5. DIを使った実装例
5. DIを使った実装例

それでは依存性逆転原則に沿ってUserServiceを修正します。


type UserService struct {
    db Database
}

func (u UserService) Register(name string) {
    u.db.Save(name)
}

func main() {
    mysql := MySQL{}
    service := UserService{db: mysql}
    service.Register("Hanako")
}

このコードではUserServiceはDatabaseに依存しています。MySQLという具体的な実装には依存していません。これが依存性逆転原則の基本です。

main関数で具体的な実装を渡しています。このように外から渡す形がDIです。

6. 別の実装へ簡単に差し替える

6. 別の実装へ簡単に差し替える
6. 別の実装へ簡単に差し替える

Go言語の設計が正しくできていると、別の実装へ簡単に変更できます。たとえばテスト用の保存処理を作ります。


type MockDB struct{}

func (m MockDB) Save(data string) {
    fmt.Println("テスト用保存:", data)
}

func main() {
    mock := MockDB{}
    service := UserService{db: mock}
    service.Register("Jiro")
}

実行結果は次のようになります。


テスト用保存: Jiro

このように、UserServiceのコードを変更せずに動きを変えられます。これがGo言語でDIを使う大きなメリットです。

7. なぜ保守性が高まるのか

7. なぜ保守性が高まるのか
7. なぜ保守性が高まるのか

保守性とは、あとから修正しやすいかどうかという意味です。依存が強いと、一か所の変更が他にも広がります。

依存性逆転原則を使うと、上の層は抽象に依存します。下の層はその抽象を実装します。これにより責任の分離ができ、役割がはっきりします。

Go言語のマイクロサービス開発やクリーンアーキテクチャでも、この考え方はよく使われます。インターフェースを中心に設計することで、拡張やテストがしやすくなります。

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

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

※ Amazon広告リンク

8. Go言語でDIを使うときの注意点

8. Go言語でDIを使うときの注意点
8. Go言語でDIを使うときの注意点

初心者が注意したいのは、インターフェースを作りすぎないことです。必要な分だけ定義します。小さな単位で設計すると理解しやすくなります。

また、インターフェースは利用する側に置くのが一般的です。使う側が必要な動きだけを決めることで、より柔軟な設計になります。

Go言語の依存性逆転原則とDIは、難しく見えますが、外から部品を渡すという考え方を意識すれば理解できます。アーキテクチャ設計の基本として覚えておくと、長く使える知識になります。

関連セミナーのご案内

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

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

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

具体的な開発内容と環境

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

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

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

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

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

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

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

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

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

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

セミナー画像

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

カテゴリの一覧へ
新着記事
New1
Go言語
Go言語のポートとアダプタ(Hexagonal Architecture)の基本をやさしく解説!初心者向け設計入門
New2
Kotlin
Kotlinの複数catchの使い方を初心者向けにやさしく解説!例外の種類ごとに分けて処理する方法
New3
Kotlin
Kotlinのtry式とは?初心者でもわかる例と使い方をやさしく解説
New4
Kotlin
Kotlinのfinallyブロックの使い方を完全ガイド!初心者でもわかる例外処理の後片付け
人気記事
No.1
Java&Spring記事人気No1
Kotlin
Kotlinの可変マップ(MutableMap)の使い方を初心者向けに紹介!キーと値を自由に追加・変更・削除しよう
No.2
Java&Spring記事人気No2
Kotlin
Gradleファイル(build.gradle.kts)の書き方と役割をやさしく解説!Kotlin初心者向け完全ガイド
No.3
Java&Spring記事人気No3
Go言語
Go言語のgo.modファイル完全ガイド!初心者でもわかる仕組みと書き方
No.4
Java&Spring記事人気No4
Kotlin
Android Studioのインストール手順と初期設定を初心者向けに完全解説!
No.5
Java&Spring記事人気No5
Kotlin
KotlinのRoomで複雑なクエリを使いこなす!初心者でもわかる応用テクニック
No.6
Java&Spring記事人気No6
Swift
Swift Playgroundの使い方を完全解説!初心者に最適な学習環境の始め方
No.7
Java&Spring記事人気No7
Kotlin
Kotlinのログ出力方法を完全ガイド!LogcatとTimberでトラブルシューティング
No.8
Java&Spring記事人気No8
Kotlin
Kotlinのsettings.gradleファイルを完全解説!初心者でもわかるプロジェクト設定の基本