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

Go言語の構造体の可視性(大文字小文字)の仕組みを理解しよう

Go言語の構造体の可視性(大文字小文字)の仕組みを理解しよう
Go言語の構造体の可視性(大文字小文字)の仕組みを理解しよう

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

生徒

「Go言語で構造体のフィールド名を大文字にする意味ってあるんですか?」

先生

「はい、大きな意味があります。Goでは大文字と小文字で、そのフィールドが外部から見えるかどうか(公開か非公開か)を決めているんですよ。」

生徒

「えっ?ただの名前の書き方かと思ってました!」

先生

「では、実際のコードでその違いを見てみましょう!」

1. Go言語の構造体と可視性とは?

1. Go言語の構造体と可視性とは?
1. Go言語の構造体と可視性とは?

Go言語の可視性(エクスポート/アンエクスポート)は、名前の先頭が大文字か小文字かだけで決まります。これはとてもシンプルですが、パッケージ間でデータを安全に受け渡しするうえで重要なルールです。特に構造体(struct)のフィールドでは、このルールがそのまま「外から見える/見えない」を表します。

大文字で始まるフィールド名は「公開(エクスポート)」で、ほかのパッケージからも読み書きできます。反対に、小文字で始まるフィールド名は「非公開(アンエクスポート)」で、同じパッケージの中からだけアクセスできます。覚え方は簡単で、頭文字がA〜Zなら外に公開、a〜zなら中だけというイメージです。

まずは雰囲気をつかむために、超シンプルな例を見てみましょう。ここでは同じパッケージ内なので、公開・非公開どちらのフィールドにもアクセスできます(外部からのアクセス可否は後で意識すると理解しやすいです)。


package main

import "fmt"

// Book構造体:Titleは公開、pagesは非公開
type Book struct {
    Title string // 大文字開始:公開(エクスポート)
    pages int    // 小文字開始:非公開(アンエクスポート)
}

func main() {
    b := Book{Title: "Go入門", pages: 200}
    fmt.Println(b.Title) // OK:同じパッケージ内
    fmt.Println(b.pages) // OK:同じパッケージ内(非公開でも同一パッケージならOK)
}

ポイントは、「大文字=公開」「小文字=非公開」という単純な規則が、構造体のフィールドのアクセス可否を左右することです。まずはこの基礎を押さえておくと、後でパッケージを分けたときも迷いにくくなります。

2. 大文字・小文字の違いを実際に見てみよう

2. 大文字・小文字の違いを実際に見てみよう
2. 大文字・小文字の違いを実際に見てみよう

ここでは同じパッケージ内での動きを確認します。結論だけ先に言うと、先頭が大文字なら「公開」扱い、先頭が小文字なら「非公開」扱いです。公開・非公開という言葉はむずかしく聞こえますが、まずは「外から見える名前/中だけで使う名前」というイメージでOKです。

下のサンプルは、構造体のフィールド名をわざと大文字・小文字で分けています。同じパッケージ内なので、どちらのフィールドにもアクセスできます。出力される様子から、特別な設定なしで名前の書き方だけで可視性が決まることを体感しましょう。


package main

import "fmt"

// Person構造体を定義(Nameは公開、ageは非公開)
type Person struct {
    Name string // 大文字開始:公開(エクスポート)
    age  int    // 小文字開始:非公開(アンエクスポート)
}

func main() {
    // 同じパッケージ内なので、どちらも代入・参照できる
    p := Person{Name: "田中", age: 30}
    fmt.Println("公開フィールド:", p.Name) // OK
    fmt.Println("非公開フィールド:", p.age)  // OK(同一パッケージだから)
}

ポイントは「決め手は頭文字だけ」ということ。Goではアクセス修飾子(public/privateなど)のキーワードを使わず、大文字=公開、小文字=非公開を統一ルールにしています。まずはこの感覚をつかんでおくと、次のセクションでパッケージが分かれたときの違いもスッと飲み込めます。

3. 別パッケージからアクセスしたときの挙動

3. 別パッケージからアクセスしたときの挙動
3. 別パッケージからアクセスしたときの挙動

別パッケージとは、ざっくり言うと「フォルダが分かれた別のまとまり」です。ここでは、構造体を定義するpersonパッケージと、それを使うmainパッケージに分けて、大文字/小文字で可視性がどう変わるかを体験します。


// person/person.go(別パッケージ)
package person

// Person構造体:Nameは公開、ageは非公開
type Person struct {
    Name string // 大文字開始:公開(他パッケージから見える)
    age  int    // 小文字開始:非公開(同一パッケージ内だけ)
}

func New(name string, a int) Person {
    return Person{Name: name, age: a}
}

// main.go(利用側のパッケージ)
package main

import (
    "fmt"
    "example/person" // 自分のモジュール名に合わせて読み替え
)

func main() {
    p := person.New("佐藤", 28)
    fmt.Println(p.Name) // OK:公開(大文字)なので参照できる
    fmt.Println(p.age)  // NG:非公開(小文字)なので参照できない
}

実行(ビルド)すると、非公開フィールドageに触れた行でエラーになります。これは「小文字で始まる名前は外から見えない」というルールが効いているためです。


./main.go:12:18: p.age undefined (cannot refer to unexported field or method age)

まとめると、別パッケージから使いたいフィールドは大文字で始めるのがコツです。小文字のフィールドはパッケージの内側の実装詳細として隠せるので、意図しない直接操作を防ぎ、データ構造を安全に保てます。

4. フィールドだけでなく関数や構造体名にも可視性のルールがある

4. フィールドだけでなく関数や構造体名にも可視性のルールがある
4. フィールドだけでなく関数や構造体名にも可視性のルールがある

Go言語では、構造体のフィールド名だけでなく、関数名や構造体名にも同じルールが適用されます。大文字で始めると公開、小文字で始めると非公開になります。


// 公開された構造体
type Animal struct {
    Name string
}

// 非公開の関数(他パッケージから呼べない)
func makeNoise() {
    fmt.Println("ワンワン!")
}

// 公開された関数(他パッケージから呼べる)
func MakeNoise() {
    fmt.Println("ワンワン!")
}

Go言語ではこのようにして、シンプルな書き方でアクセス制御(可視性)を実現しています。これは他の言語でいうpublicprivateといったアクセス修飾子の代わりになります。

5. 実際に自分で書いて確かめてみよう

5. 実際に自分で書いて確かめてみよう
5. 実際に自分で書いて確かめてみよう

ここまでの内容は、「名前の最初の文字を大文字にするかどうか」という一見単純なルールに見えますが、Go言語の設計思想にもとづいた非常に重要なポイントです。

初学者の方も、自分で構造体や関数を書いて、大文字・小文字の違いでアクセスできるかどうかを試してみると理解が深まります。

まとめ

まとめ
まとめ

この記事ではごとく簡潔で迷いの少ない記法を採用するごの設計思想に沿ってごの可視性の考え方を整理した。ごの構造体のフィールドや関数やメソッドや型名は頭文字の大小だけで公開範囲が決まり、外側に見せたいものは大文字ではじめ、内部に閉じたいものは小文字ではじめるという一貫した作法がある。とくに構造体の設計では名前の一文字が意図の伝達そのものであり、読み手にも書き手にも負担をかけず、依存を最小化しながら安全なデータの受け渡しを実現できる。実務では小さな構造体から大きなドメインまで一貫してこの原則が効き、可読性や保守性やテスト容易性に直結する。ごの言語ならではの最小主義を活かすためにも、最初の段階で公開と非公開の境界をていねいに決め、意図を名前に刻む習慣を持とう。

まずはごの基本ルールを確認する。頭文字が大文字ならエクスポートであり、別のパッケージからも参照できる。頭文字が小文字ならアンエクスポートであり、同じパッケージの内部からのみ利用できる。難しい記号や特別なキーワードを覚える必要はなく、単純な命名規則だけで安全なアクセス制御が成立する。学びはじめの段階ではつい詳細な設定に目を向けがちだが、最小の労力で最大の効果を出すには名前の設計に集中するのが近道である。読み書きの方向や責務の境界が曖昧なときは、外から触れてよいものを大文字にそろえ、内部の詳細は小文字のまま閉じておくと整理が進む。

次に実装時の考え方を整理する。構造体の大文字のフィールドは他のパッケージの呼び手にとっての契約の入り口であり、外部との交換に耐える安定した名前にすべきである。逆に小文字のフィールドは内部の都合や最適化や一時的な状態などを含むことが多く、いつでも変更できる前提で扱える。これにより呼び手に余計な知識を要求せず、変更の影響範囲を小さく保てる。関数やメソッドでも同じであり、外から呼ばれる入口は大文字でそろえ、内部の補助は小文字で隠す。命名は設計であり、設計は命名に現れる。名前が揃えば仕様が自然と読み取れ、レビューやドキュメントやテストも軽くなる。

実際の開発ではうっかり起こりやすい落とし穴がいくつかある。ひとつは型名を小文字で定義してしまい、構造体のフィールドを大文字にしても他のパッケージからその型自体が見えなくなる点である。もうひとつは大文字と小文字を混ぜすぎて意図が読み取りにくくなる点である。用途が外部向けか内部向けかを先に決め、単語の区切りや略語の扱いをチームで統一しておくと誤解が減る。さらにテストの観点では、公開の最小化はモックの過剰な準備を避ける助けになる。必要な入口だけが大文字で表に出ていれば、テスト対象の境界がはっきりし、意図しない結合を防げる。

設計指針としては、まず公開したい情報を最小限に絞り、読み手が理解に迷わない単純な名前を与える。外から直接触れてほしくない状態は小文字のままにし、必要があれば公開された関数経由で安全に扱う。データの整合性を守るルールや前提条件は公開側の表面で満たされるようにし、内部の小文字側では軽量な最適化や差し替えを自由に行う。これにより長期の運用でも仕様の安定と実装の自由を両立できる。ごの言語の現場ではこのような地味な命名規則が最終的な品質に直結しており、学習直後から意識しておく価値が高い。

またドキュメントやレビューの場では、公開の名前の一覧を用意して、何を外部に約束しているかを共有するとよい。名前の変更は互換性に影響するため、理由を明らかにし、段階的な移行を計画する。内部の小文字の変更は原則として自由だが、影響と前提を軽くメモしておくと後からの追跡が容易になる。小さな約束の積み重ねが大きな信頼につながり、利用者にとっても提供者にとっても無理のない進化が実現できる。

すぐ試せる小さなサンプル

下の最小サンプルは外に見せたい名前だけを大文字でそろえ、内部の詳細は小文字で隠す構成になっている。まずはそのまま動かし、その後で頭文字を入れ替えて挙動を比べると理解が深まる。小さな成功体験を積み重ねることで、命名の判断が自然に速くなる。


package main

import "fmt"

// 公開の窓口は大文字でそろえる
type User struct {
    Name string // 公開
    id   int    // 非公開
}

func NewUser(name string, id int) User { // 公開
    return User{Name: name, id: id}
}

func (u User) Label() string { // 公開
    return fmt.Sprintf("%s", u.Name)
}

func (u User) raw() int { // 非公開
    return u.id
}

func main() {
    u := NewUser("花子", 7)
    fmt.Println(u.Label())
    // fmt.Println(u.id) // 外からは非公開
}

実務で役立つ観点

現場では読み手が多様であり、短時間で要点を把握できるかどうかが生産性を左右する。公開された名前が安定していればインターフェースの学習コストは下がり、内部の変更も安全に進められる。名前は最初の設計書であり、最終の仕様書でもある。頭文字のルールを守ることは、目に見えない約束事を目に見える形にする作業である。ごの開発では道具や枠組みに頼らずとも、命名だけで設計を明確にできる。

学習の次の一歩としては、小さな練習課題を積み重ねるのが効果的である。日常の小さな機能でも公開するものと非公開にするものを必ず決め、迷いがあれば大文字と小文字の意味に立ち返る。名前を通して意図を外部に伝え、内部では柔軟に改善を続ける。こうした姿勢が長く使われるコードにつながり、仲間との協力も円滑になる。

確認用チェックリスト

公開にしたいものは本当に外部の利用者に必要かを自問し、長く安定させられる名前かを点検する。内部に留めるものは実装都合や一時的な状態かを確認し、将来の差し替えや最適化がしやすい配置かを見直す。構造体の型名は公開するなら大文字、内部専用なら小文字という基本を守り、関数やメソッドの入口も同じ基準でそろえる。加えて、読み手が迷わない単語選びと一貫した表記が保たれているかを点検する。

よくある勘違いと対処

大文字と小文字の区別は見た目の装飾ではなく仕様の宣言である、という理解が欠けると設計が崩れやすい。名前は短くても意味が通ることが大切で、略語はチームで合意した形に統一する。外部に出す名前を増やしすぎると将来の変更が重くなるため、最初は最小限に絞り、必要が生じたときに慎重に追加する。内部の小文字の部分は自由度が高いが、前提や期待する振る舞いを軽く書き残しておくと学習コストが下がり、継続的な改良が進めやすくなる。

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

生徒

きょうは頭文字だけで公開と非公開が分かれることがわかった。大文字にすると他のパッケージから見えるので、外に約束したい情報だけを慎重に選ぶ必要があると感じた。

先生

その通りだ。見せたい入口を大文字でそろえ、内部の詳細は小文字で守る。名前の設計が決まれば依存の線引きがはっきりし、変更の影響も読みやすくなる。

生徒

型名を小文字にしてしまうと型そのものが外から見えない点も印象に残った。公開したい構造体は型名も大文字で書くように気をつけたい。

先生

よい気づきだ。まず外に示す名前を決め、次に内部の名前を整える。小さな練習を重ねれば、自然と判断が速くなる。

生徒

これからは公開したいものだけを大文字にして、内部の詳細は小文字にする。迷ったら名前の意味を見直して、意図を短い言葉で表すようにする。

先生

その姿勢で十分だ。名前は設計の第一歩だ。丁寧に選べば、コードは自然に読みやすく、長く育つ。

最後にもう一度だけ確認しよう。頭文字の大小が境界を定め、設計の意図を短い言葉で示す。この約束を守るだけで、学習も実装も保守も着実に軽くなる。

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

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

※ Amazon広告リンク

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

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

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

Go言語の構造体で、大文字で始まるフィールド名が「公開」になる仕組みがなぜ重要なのか、初心者にもわかりやすく教えてください。ほかのプログラミング言語のpublicやprivateとの違いも知りたいです。

Go言語では、構造体のフィールド名を大文字で始めるだけで自動的に公開扱いになり、別パッケージからアクセスできるようになります。小文字で始めると非公開です。他の言語だとpublicやprivateなどのアクセス修飾子を明示的に書きますが、Goは大文字と小文字の違いだけでアクセス制御するというシンプルなルールを採用しています。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
Kotlin
Gradleファイル(build.gradle.kts)の書き方と役割をやさしく解説!Kotlin初心者向け完全ガイド
No.5
Java&Spring記事人気No5
Go言語
Go言語のgo.modファイル完全ガイド!初心者でもわかる仕組みと書き方
No.6
Java&Spring記事人気No6
Swift
Swift Playgroundの使い方を完全解説!初心者に最適な学習環境の始め方
No.7
Java&Spring記事人気No7
Go言語
Go言語で条件式を1行で書くコツ!三項演算子の代替と短縮記法
No.8
Java&Spring記事人気No8
Kotlin
Kotlinの演算子一覧と使い方!算術・比較・論理演算子の基本を解説