【ITニュース解説】Go (Golang) Basic - Structuring Project with Packages
2025年09月28日に「Dev.to」が公開したITニュース「Go (Golang) Basic - Structuring Project with Packages」について初心者にもわかりやすく解説しています。
ITニュース概要
Go言語のプロジェクトでコードを整理するには「パッケージ」を使う。パッケージは関連ファイルをまとめるフォルダで、他のファイルからインポートして利用する。Goでは、関数名などを大文字で始めると公開され、小文字だと非公開となる。これにより、コードの構造化と管理がしやすくなる。
ITニュース解説
Go言語でソフトウェア開発を行う際、プログラムの規模が小さいうちは、全てのコードをmain.goのような単一のファイルにまとめても問題なく動作する。しかし、プロジェクトが成長し、コードの量が膨大になるにつれて、一つのファイルで全てを管理することは非常に困難になり、コードの読みやすさやメンテナンス性、再利用性が著しく低下する。このような状況を解決し、コードを論理的な単位に整理し、再利用可能な部品として管理するためのGo言語の仕組みが「パッケージ」である。
パッケージとは、本質的にはGoファイルを含むディレクトリ、つまりコンピュータ上のフォルダのことだ。関連するGoファイルを一つのディレクトリにまとめることで、コードの役割を明確にし、構造化されたプロジェクトを構築できる。Go言語の全てのファイルは、ファイルの冒頭でそのファイルがどのパッケージに属するかをpackage <パッケージ名>という形式で明示的に宣言しなければならない。
例えば、簡単な計算ユーティリティを作成したい場合を考える。まず、プロジェクトのルートディレクトリ(例えばmy-go-project)の中に、新しくcalculatorという名前のサブディレクトリを作成する。これで、my-go-project/calculator/というパスが、我々が作成する新しいパッケージの場所となる。次に、このcalculatorディレクトリの中にadd.goというファイルを作成する。このadd.goファイルを開き、一番最初にpackage calculatorと記述する。これにより、このファイルがcalculatorパッケージの一部であることが宣言される。ファイル内には、例えば二つの整数を足し合わせるAdd関数などを記述する。このcalculatorディレクトリ内の全てのGoファイルは、必ずpackage calculatorという宣言で始まる必要がある。
作成したcalculatorパッケージ内のAdd関数を、main.goのような別のファイルから利用するには、「インポート」という操作が必要になる。main.goファイルを開き、importブロックの中に"my-first-go-project/calculator"という行を追加する。ここで、my-first-go-projectはGoプロジェクト作成時にgo.modファイルで定義したモジュール名であり、calculatorは作成したパッケージ名だ。このように、<モジュール名>/<パッケージ名>という形式でカスタムパッケージをインポートする。パッケージがインポートされると、main.go内でcalculator.Add(5, 3)のように、パッケージ名をプレフィックスとして付けて関数を呼び出すことができる。この呼び出しにより、calculatorパッケージに定義されたAdd関数が実行され、結果が返される。
Go言語には、他の多くのプログラミング言語に見られるpublicやprivateといった明示的なアクセス制御キーワードが存在しない。代わりに、非常にシンプルかつ効果的な可視性のルールを採用している。このルールは、名前(関数、構造体、変数など)の最初の文字が大文字であるか小文字であるかによって、その機能がパッケージの外部からアクセス可能かどうかが決定されるというものだ。
具体的には、名前が大文字で始まる場合、その名前はPublic(エクスポート済み)と見なされる。これは、その機能が他のパッケージからもアクセスできることを意味する。例えば、先ほど作成したAdd関数はAが大文字で始まっているため、main.goファイルからcalculator.Add()として問題なく呼び出すことが可能だった。これは、Add関数がcalculatorパッケージの外部に公開されているためだ。
一方、名前が小文字で始まる場合、その名前はPrivate(エクスポートされていない)と見なされる。これは、その機能が定義された同じパッケージの内部からのみアクセス可能であり、パッケージの外部からはアクセスできないことを意味する。このルールを試すために、calculator/add.goファイルに、例えば二つの整数を減算するsubtract関数を、小文字のsで始まるfunc subtract(a int, b int) int { return a - b }のように追加してみる。そして、main.goファイルからcalculator.subtract(5, 3)のように、このsubtract関数を呼び出そうとすると、Goコンパイラはエラーを発生させる。エラーメッセージは「cannot refer to unexported name calculator.subtract」(エクスポートされていない名前calculator.subtractを参照できません)といった内容になる。これは、subtract関数がcalculatorパッケージの内部でのみ使用されることを意図しており、外部のパッケージからはアクセスできないようにGoが保護しているためである。このシンプルなルールにより、開発者は意図しない外部からのアクセスを防ぎ、コードの凝集性を高めることができる。
このように、Go言語のパッケージによるコードの構造化と、大文字・小文字による明快な可視性ルールを理解することは、システムエンジニアとして堅牢で保守しやすいGoアプリケーションを開発する上で不可欠な基礎となる。Goの基本的な構文、データ型、制御フロー、関数、構造体、メソッド、ポインタ、エラーハンドリングといった要素に加えて、パッケージによるプロジェクトの組織化を習得することで、より複雑なシステム開発に対応できる強力な基盤が築かれる。今後は、Go言語の大きな特徴である並行処理のためのGoroutineとChannel、豊富な機能を提供する標準ライブラリ、さらにはWebアプリケーションやコマンドラインツールなどの具体的なプロジェクト開発へと学習を進めることができるだろう。