目次
Module・Packageの仕組みを理解する
Go言語では、**Module(モジュール)とPackage(パッケージ)**を使ってプログラムを整理し、管理することが重要です。本記事では、これらの基本的な概念、実装方法、変数のスコープ、パッケージの定義方法について詳しく解説します。
1. Module(モジュール)とは?
モジュールの概要
Goのモジュールは、プロジェクト全体を管理する単位であり、外部ライブラリの管理にも使用されます。モジュールは go.mod
というファイルによって定義されます。
モジュールの作成手順
- プロジェクトフォルダを作成
go mod init <モジュール名>
を実行go.mod
ファイルが生成される
例: モジュールの作成
mkdir myproject
cd myproject
go mod init github.com/youraccount/myproject
これにより、go.mod
が作成され、モジュールの管理が開始されます。
go.mod ファイルの内容
module github.com/youraccount/myproject
go 1.21
このファイルには、モジュールの名前と使用するGoのバージョンが記載されます。
2. Package(パッケージ)とは?
パッケージの概要
パッケージは、コードを整理し、再利用可能にするための単位です。Goでは、すべてのコードは必ず何らかのパッケージに属します。
パッケージの種類
main
パッケージ- 実行可能なプログラムを作成するための特別なパッケージ
func main()
を持つ必要がある
- ユーザー定義パッケージ
- 再利用可能な機能をまとめたライブラリ
パッケージの作成と使用方法
calculator パッケージの作成
mkdir -p calculator
sum.go(calculatorパッケージの一部)
package calculator
func Add(a, b int) int {
return a + b
}
パッケージを main.go
で使用する
package main
import (
"fmt"
"github.com/youraccount/myproject/calculator"
)
func main() {
result := calculator.Add(3, 5)
fmt.Println("3 + 5 =", result)
}
go run main.go
を実行すると、パッケージ calculator
を正しく呼び出していることが確認できます。
3. 変数・関数のスコープ(大文字・小文字のルール)
Go言語では、識別子(変数・関数・構造体など)のスコープは、大文字・小文字によって決まります。
公開(エクスポート)ルール
- 大文字で始まる識別子 → 他のパッケージからアクセス可能
- 小文字で始まる識別子 → パッケージ内でのみアクセス可能
例: エクスポートの違い
package calculator
// エクスポートされる関数(大文字)
func Add(a, b int) int {
return a + b
}
// エクスポートされない関数(小文字)
func subtract(a, b int) int {
return a - b
}
この場合、Add
は外部の main
パッケージから利用できますが、subtract
は calculator
パッケージ内でのみ使用可能です。
4. 複数のパッケージを組み合わせる方法
Goでは、プロジェクト内に複数のパッケージを作成し、それらを組み合わせることができます。
例: calculator
パッケージに multiply.go
を追加
multiply.go
package calculator
func Multiply(a, b int) int {
return a * b
}
main.go で利用
package main
import (
"fmt"
"github.com/youraccount/myproject/calculator"
)
func main() {
fmt.Println("3 × 4 =", calculator.Multiply(3, 4))
}
このように、新しい .go
ファイルを同じパッケージ内に追加することで、機能を拡張できます。
5. 外部パッケージの利用と管理
Goでは、標準ライブラリのほか、外部のパッケージを go get
コマンドを使って取得できます。
外部パッケージのインストール
go get github.com/gorilla/mux
これにより、go.mod
に依存関係が追加され、パッケージがダウンロードされます。
外部パッケージの使用例
package main
import (
"fmt"
"github.com/gorilla/mux"
)
func main() {
router := mux.NewRouter()
fmt.Println("Router initialized:", router)
}
まとめ
項目 | 説明 |
---|---|
モジュール | プロジェクト全体を管理する単位(go.mod 必須) |
パッケージ | コードを整理し、再利用するための単位 |
package main | main.go で実行可能プログラムを作成するための特別なパッケージ |
大文字/小文字のルール | 大文字 → エクスポート(公開) / 小文字 → 非公開 |
外部パッケージ | go get でインストールし、import で使用 |