カテゴリ: Go言語 更新日: 2026/02/05

Go言語の構造体の埋め込み(匿名フィールド)の使い方をやさしく解説!

Go言語の構造体の埋め込み(匿名フィールド)の使い方
Go言語の構造体の埋め込み(匿名フィールド)の使い方

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

生徒

「Go言語には構造体の『埋め込み』とか『匿名フィールド』っていう仕組みがあると聞いたのですが、何ができるんですか?」

先生

「構造体の埋め込みを使うと、ある構造体の機能をほかの構造体で“継承っぽく”使えるんですよ。Goでは継承は使わないけれど、似たことができるんです。」

生徒

「継承っぽいってどういうことですか?詳しく教えてください!」

先生

「それでは、構造体の埋め込みの仕組みを、初心者でもわかるように順に説明しますね!」

1. 匿名フィールド(埋め込み)とは?

1. 匿名フィールド(埋め込み)とは?
1. 匿名フィールド(埋め込み)とは?

Go言語の匿名フィールド(埋め込み)は、構造体の中に別の構造体を“名前なしで”そのまま入れ込む仕組みです。通常のフィールドのように「フィールド名: 型」と書かず、型だけを書くことで利用できます。これによって、埋め込んだ構造体が持つフィールドやメソッドを、まるで自分のもののように扱えるようになります。

イメージとしては、「バッグの中に小物ポーチをそのまま入れて、ポーチの中身をバッグの中身として扱える」ような感覚です。ポーチのファスナーを毎回開けなくても、中身に直接アクセスできるイメージですね。継承のように見えますが、Goではあくまで“埋め込まれて共有している”だけなので、とてもシンプルです。

まずは、匿名フィールドを使った最小の例を見てみましょう。


package main

import "fmt"

type Info struct {
    ID int
}

type User struct {
    Info // 匿名フィールドとして埋め込み
}

func main() {
    u := User{Info: Info{ID: 10}}
    fmt.Println("ユーザーID:", u.ID) // Info.ID を直接参照できる
}

この例のように、UserInfoを埋め込むだけで、u.IDという形で直接アクセスできるようになります。初心者の方でもすぐに「なるほど、こういう便利さがあるのか」と実感できるはずです。

2. 埋め込み構造体の書き方

2. 埋め込み構造体の書き方
2. 埋め込み構造体の書き方

埋め込み構造体の基本はとてもシンプルで、「フィールド名を書かずに型だけを書く」だけです。Go言語では、この書き方をすることで、その型の持つフィールドやメソッドを“自分の構造体のもの”として扱えるようになります。初心者にとっては難しそうに見えますが、一度動きを見ると直感的で理解しやすい仕組みです。

まずは典型的な例を見てみましょう。動物を表すAnimal構造体を、犬を表すDog構造体に埋め込みます。


type Animal struct {
    Name string
}

type Dog struct {
    Animal  // Animal構造体を埋め込み
    Breed  string
}

この書き方をすると、Dog の中に Animal のフィールドが“直接”存在しているように扱えます。つまり、Dog構造体を使うときに、d.Animal.Nameと書かず、d.Nameとそのまま使えるようになります。

簡単な動作例も見てみましょう。


package main

import "fmt"

type Animal struct {
    Name string
}

type Dog struct {
    Animal
    Breed string
}

func main() {
    d := Dog{
        Animal: Animal{Name: "モモ"},
        Breed:  "コーギー",
    }

    fmt.Println("犬の名前:", d.Name)     // Animal.Name を直接参照
    fmt.Println("犬の種類:", d.Breed)
}

このように、構造体の埋め込みを使うと「別の構造体の機能を簡単に取り込む」ことができ、コードの重複を減らす助けになります。慣れるととても便利なテクニックなので、まずは小さな例から触れて感覚をつかんでみてください。

3. 埋め込みの簡単な例

3. 埋め込みの簡単な例
3. 埋め込みの簡単な例

上記を使って、実際に動かしてみましょう!


package main

import "fmt"

type Animal struct {
    Name string
}

func (a Animal) Speak() {
    fmt.Println(a.Name, "が鳴いています")
}

type Dog struct {
    Animal
    Breed string
}

func main() {
    d := Dog{
        Animal: Animal{Name: "ポチ"},
        Breed:  "柴犬",
    }
    fmt.Println("名前:", d.Name)
    d.Speak()
    fmt.Println("種類:", d.Breed)
}

実行結果:


名前: ポチ
ポチ が鳴いています
種類: 柴犬

ポイントはd.Named.Speak()がそのまま使えるところです。まるでNameSpeakDogに属しているかのように使えます。

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

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

※ Amazon広告リンク

4. 埋め込みのメリットと注意点

4. 埋め込みのメリットと注意点
4. 埋め込みのメリットと注意点
  • コードの再利用:Animal構造体に定義をまとめておけば、ほかの構造体でも使える。
  • 読みやすさアップ:Dog構造体からNameSpeakに直接アクセスでき、コードがシンプル。
  • 注意点:もし埋め込み先と埋め込み元で同じフィールド名やメソッド名を定義すると、どちらを使うか曖昧になります。

5. 同名フィールドがあるときはどう書く?

5. 同名フィールドがあるときはどう書く?
5. 同名フィールドがあるときはどう書く?

例えば、Dog構造体にNameフィールドを直接追加すると、どちらのNameを参照するか明示が必要になります。


type Dog struct {
    Animal
    Name string  // 同じNameというフィールド
}

このとき、d.NameDog.Nameを指し、d.Animal.Nameで埋め込み元のNameにアクセスできます。

6. メソッドの埋め込み利用

6. メソッドの埋め込み利用
6. メソッドの埋め込み利用

構造体にメソッドを定義しておけば、埋め込み先でもそのメソッドを呼び出せます。


func (a Animal) Move() {
    fmt.Println(a.Name, "が歩いています")
}

func main() {
    d := Dog{Animal: Animal{Name: "タロウ"}, Breed: "雑種"}
    d.Move()  // Animalのメソッドをそのまま実行
}

このように、電話にカメラを搭載して「写真を撮る」という機能がそのまま使えるイメージです!

7. 匿名フィールドは組み込み型にも使える?

7. 匿名フィールドは組み込み型にも使える?
7. 匿名フィールドは組み込み型にも使える?

はい、例えばtime.Timeを埋め込んで、構造体に時間操作機能を追加することもできます。


type Event struct {
    time.Time
    Title string
}

こうすると、EventTimeのメソッド(たとえばYear())が使えます。

8. まとめずに最後に文字数を記載

8. まとめずに最後に文字数を記載
8. まとめずに最後に文字数を記載

この記事ではGo言語の匿名フィールド(構造体埋め込み)について、定義方法、使い方、メリット、注意点をやさしく解説しました。構造体をもっと便利に使える基本テクニックです。

まとめ

まとめ
まとめ

Go言語における構造体の埋め込み(匿名フィールド)は、オブジェクト指向言語における「継承」に似た役割を果たしながらも、Go言語らしいシンプルで直感的な書き方を実現する仕組みです。この記事を通して、匿名フィールドを使うことでコードを再利用しやすくなり、可読性が高まることを学びました。たとえば、Animal構造体をDog構造体に埋め込むことで、NameSpeakメソッドを直接利用できるのはとても便利です。

また、構造体埋め込みを利用することで、メソッドの再利用共通処理の共有が可能になり、コードの重複を避けられる点も大きなメリットでした。特に複数の構造体で同じ性質を持たせたいときに役立ちます。さらに、標準ライブラリのtime.Timeを埋め込む例のように、既存の便利な機能を組み込んで拡張できる点もGoならではの強力な機能です。

ただし、注意点として同名フィールドやメソッドの衝突があります。たとえば、Dog構造体にNameを直接定義した場合、d.NameはDogのフィールドを参照し、d.Animal.Nameを明示しなければならなくなります。これは大規模開発やチーム開発で特に気をつけたい部分です。

まとめると、Go言語の構造体埋め込みは「継承の代わりにコードをシンプルに再利用するためのテクニック」であり、Go言語らしい考え方を理解するうえで欠かせない基本知識です。今後、API設計や大規模なプログラム開発を行うときに必ず役立つ概念なので、初心者のうちからしっかり身につけておきましょう。

サンプルプログラムでまとめを確認


package main

import (
    "fmt"
    "time"
)

type Animal struct {
    Name string
}

func (a Animal) Speak() {
    fmt.Println(a.Name, "が鳴いています")
}

type Dog struct {
    Animal
    Breed string
}

type Event struct {
    time.Time
    Title string
}

func main() {
    d := Dog{
        Animal: Animal{Name: "ハチ"},
        Breed:  "秋田犬",
    }
    d.Speak()
    fmt.Println("犬種:", d.Breed)

    e := Event{
        Time:  time.Now(),
        Title: "勉強会",
    }
    fmt.Println("イベント:", e.Title, "年:", e.Year())
}

上記のプログラムでは、Animalを埋め込んだDogがSpeak()を呼び出せること、さらにtime.Timeを埋め込んだEventがYear()を使えることを確認できます。このように埋め込みは実用性が高く、日常的に活用できる便利な仕組みです。

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

生徒

「Go言語の構造体の埋め込みって、やっぱりすごく便利ですね!継承みたいに使えるけど、シンプルでわかりやすいです。」

先生

「そうですね。Goは継承を持たない代わりに、埋め込みで機能を柔軟に再利用できるんです。特に、標準ライブラリの構造体をそのまま活用できるのは大きな魅力ですよ。」

生徒

「同じフィールド名があるときに注意が必要だと学びました。d.Named.Animal.Nameを区別して使うのは重要ですね。」

先生

「その通りです。曖昧さを避けるために、コードを書くときやレビューするときには必ず意識しておくと良いですよ。」

生徒

「これからは埋め込みを使って、コードの再利用性を高めながら効率的にプログラムを書いていきたいです!」

先生

「素晴らしい心がけですね。埋め込みを理解すれば、Go言語での開発がもっと楽しく効率的になりますよ。」

この記事のまとめ部分の全角文字数:2832文字

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Go言語の構造体における匿名フィールドや埋め込みとは具体的にどんな仕組みですか?

Go言語の構造体における匿名フィールドや埋め込みとは、フィールド名を省略して型だけを記述することで、他の構造体をまるごと組み込める仕組みです。これにより継承のように機能を再利用でき、コードの可読性や再利用性が向上します。

Go言語では継承がないと聞きましたが、埋め込みを使うことでオブジェクト指向的な継承のようなことはできますか?

はい、Go言語には継承の仕組みはありませんが、構造体の埋め込みを利用することで「継承っぽい」動きを実現できます。親にあたる構造体のフィールドやメソッドを、子にあたる構造体から直接呼び出せます。

この記事の質問と回答部分の全角文字数:2864文字

関連記事:
カテゴリの一覧へ
新着記事
New1
Go言語
Go言語の短絡評価(ショートサーキット)を使った条件式の工夫をやさしく解説!初心者でも理解できる基本知識
New2
Go言語
Go言語の構造体の初期化パターンとコンストラクタ的関数の書き方を徹底解説!初心者でもわかる基本と実用例
New3
Kotlin
Kotlinの例外処理とキャンセルの連携を完全ガイド!初心者でもわかるCoroutineExceptionHandlerの使い方
New4
Go言語
Go言語のクロージャとは?関数内関数の活用例と仕組み
人気記事
No.1
Java&Spring記事人気No1
Kotlin
KotlinのChannelでデータをやり取りする方法を完全ガイド!初心者にもわかる非同期通信の基本
No.2
Java&Spring記事人気No2
Go言語
Go言語でのDB接続情報を環境変数で管理する方法|初心者でも安全に設定
No.3
Java&Spring記事人気No3
Kotlin
Kotlinのビルド設定エラーと解決法まとめ!初心者向けGradleトラブル対処ガイド
No.4
Java&Spring記事人気No4
Kotlin
Android Studioのインストール手順と初期設定を初心者向けに完全解説!
No.5
Java&Spring記事人気No5
Kotlin
Gradleファイル(build.gradle.kts)の書き方と役割をやさしく解説!Kotlin初心者向け完全ガイド
No.6
Java&Spring記事人気No6
Kotlin
Kotlinでテキスト表示・編集!初心者でもわかるTextViewとEditTextの使い方
No.7
Java&Spring記事人気No7
Swift
Swift Playgroundの使い方を完全解説!初心者に最適な学習環境の始め方
No.8
Java&Spring記事人気No8
Go言語
Go言語のgo.modファイル完全ガイド!初心者でもわかる仕組みと書き方

💻 作業効率アップに

ノートPCを縦置きしてデスクを広く。
省スペースで片づく定番スタンド

UGREEN 縦型スタンドをAmazonで見る

※ Amazon広告リンク