フリーキーズ | 独学プログラミング

Go言語の構造体struct入門!データをまとめて扱う基本とは?初心者向けガイド

リンドくん

リンドくん

先生、Go言語を勉強してるんですけど、「構造体」って何ですか?なんだか難しそうで...

たなべ

たなべ

構造体は関連するデータをまとめて扱うための箱のようなものなんだ。
例えば、ユーザーの「名前」「年齢」「メールアドレス」をバラバラに管理するより、一つの箱に入れた方が便利だと思わない?

プログラミングを学んでいる方にとって、データの管理は重要なスキルの一つです。
特にGo言語では、構造体(struct)という仕組みを使って、関連するデータを効率的にまとめて扱うことができます。

本記事では、Go言語の構造体について、プログラミング初心者の方でも理解できるよう、基本概念から実際のコード例まで段階的に解説していきます。
構造体を理解することでより実用的なプログラムを作れるようになれるため、必須の基礎知識となります。

まずは「なぜ構造体が必要なのか」から始めて、実際に手を動かして学んでいきましょう!

プログラミング学習でお悩みの方へ

HackATAは、エンジニアを目指す方のためのプログラミング学習コーチングサービスです。 経験豊富な現役エンジニアがあなたの学習をサポートします。

✓ 質問し放題

✓ β版公開中(2025年内の特別割引)

HackATAの詳細を見る

構造体とは何か?なぜ必要なのか

リンドくん

リンドくん

でも、変数を個別に作れば良いんじゃないですか?

たなべ

たなべ

確かにそう思うよね。でも、実際のプログラムではたくさんのデータを扱うことが多いんだ。
例えば、100人のユーザー情報を管理する場合を想像してみて。変数を個別に作ると大変なことになるよ。

構造体とは、関連する複数のデータを一つのまとまりとして定義できる仕組みです。Go言語ではstructキーワードを使って構造体を定義します。

なぜ構造体が必要なのか?

プログラミングにおいて、データは密接に関連していることが多いものです。例えば、以下のような情報を考えてみてください。

  • ユーザー情報: 名前、年齢、メールアドレス
  • 商品情報: 商品名、価格、在庫数
  • 座標情報: X座標、Y座標

これらを個別の変数で管理すると、以下のような問題が発生します。

  1. データの関係性が分からない - どの変数が関連しているのか不明
  2. 管理が煩雑になる - 変数が増えると追跡が困難
  3. 関数への受け渡しが大変 - 関連データを全て個別に渡す必要

構造体を使うことで、これらの問題を一気に解決できます。
関連するデータを一つの「型」として定義し、まとめて扱えるようになるのです。

構造体の基本的な考え方

構造体は「カスタムデータ型」と考えることができます。
Go言語にはintstringといった基本的な型がありますが、構造体を使うことで、自分だけのオリジナルな型を作ることができるのです。

これにより、プログラムの設計がより現実世界に近い形で表現でき、理解しやすく保守しやすいコードが書けるようになります。

構造体の基本的な定義と使い方

リンドくん

リンドくん

実際にはどうやって構造体を作るんですか?

たなべ

たなべ

シンプルな例から始めてみよう。まずはユーザー情報を表す構造体を作ってみるね。

構造体の定義方法

Go言語で構造体を定義するには、以下の書式を使います。

type 構造体名 struct {
    フィールド名1 型
    フィールド名2 型
    // ...
}

実際の例を見てみましょう。

package main

import "fmt"

// ユーザー情報を表す構造体
type User struct {
    Name  string
    Age   int
    Email string
}

func main() {
    // 構造体のインスタンスを作成
    var user User
    user.Name = "田中太郎"
    user.Age = 25
    user.Email = "tanaka@example.com"
    
    // 値を表示
    fmt.Println("名前:", user.Name)
    fmt.Println("年齢:", user.Age)
    fmt.Println("メール:", user.Email)
}

このコードでは、Userという構造体を定義し、3つのフィールド(NameAgeEmail)を含めています。

構造体の初期化方法

構造体のインスタンスを作成する方法はいくつかあります。

1. フィールドを個別に設定

var user User
user.Name = "田中太郎"
user.Age = 25
user.Email = "tanaka@example.com"

2. 構造体リテラルを使用(フィールド名指定)

user := User{
    Name:  "田中太郎",
    Age:   25,
    Email: "tanaka@example.com",
}

3. 構造体リテラルを使用(順序指定)

user := User{"田中太郎", 25, "tanaka@example.com"}

4. new関数を使用

user := new(User)
user.Name = "田中太郎"
user.Age = 25
user.Email = "tanaka@example.com"

初心者の方には、フィールド名を明示的に指定する方法(2番目)をおすすめします。
コードが読みやすく、後からフィールドを追加しても影響を受けにくいからです。

よくある間違いとベストプラクティス

リンドくん

リンドくん

構造体を使うときに気をつけるべきことはありますか?

たなべ

たなべ

初心者の方がよく陥る落とし穴がいくつかあるんだ。
特にフィールド名の大文字・小文字は重要なポイントなんだよ。

よくある間違い

1. フィールド名の公開・非公開を理解していない

Go言語では、フィールド名の最初の文字が大文字か小文字かで、他のパッケージからアクセス可能かどうかが決まります。

type User struct {
    Name  string // 公開フィールド(他のパッケージからアクセス可能)
    age   int    // 非公開フィールド(同じパッケージ内でのみアクセス可能)
    Email string // 公開フィールド
}

2. ポインタと値の混同

// 値を変更したい場合はポインタレシーバーを使用
func (u *User) SetAge(newAge int) {
    u.age = newAge
}

// 値を取得するだけの場合は値レシーバーでOK
func (u User) GetName() string {
    return u.Name
}

3. ゼロ値の理解不足

Go言語では、初期化されていない構造体フィールドはその型のゼロ値になります。

var user User
// user.Name は "" (空文字列)
// user.Age は 0
// user.Email は "" (空文字列)

ベストプラクティス

1. 意味のある構造体名とフィールド名を使用

// 良い例
type Customer struct {
    FirstName string
    LastName  string
    BirthDate time.Time
}

// 悪い例
type Data struct {
    A string
    B string
    C time.Time
}

2. 構造体のフィールドは関連性の高いものでまとめる

// 良い例:関連性の高いフィールドをまとめている
type Address struct {
    Street   string
    City     string
    PostCode string
    Country  string
}

type User struct {
    Name    string
    Email   string
    Address Address
}

3. バリデーション機能を組み込む

type Email string

func (e Email) IsValid() bool {
    return strings.Contains(string(e), "@")
}

type User struct {
    Name  string
    Email Email
}

これらのベストプラクティスを守ることで、保守しやすく理解しやすいコードが書けるようになります。

まとめ

リンドくん

リンドくん

構造体って思っていたより奥が深いんですね!

たなべ

たなべ

そうなんだよ!構造体をマスターすると、より実用的で保守しやすいプログラムが書けるようになるんだ。
ぜひ実際に手を動かして練習してみてね。

本記事では、Go言語の構造体について基本概念から実用的な活用例まで解説しました。

重要なポイントをおさらいしましょう。

  • 構造体は関連するデータをまとめて扱う仕組みで、プログラムの設計を現実世界に近い形で表現できる
  • 基本的な定義から応用的なメソッドの追加まで、段階的に学習することが重要
  • フィールドの公開・非公開やポインタの使い分けなど、ベストプラクティスを理解することで品質の高いコードが書ける

構造体の理解は、Go言語でより複雑なプログラムを作成するための重要な基盤となります。
ぜひ継続的に学習を進めてスキルを磨いていってください。

この記事をシェア

関連するコンテンツ