module・package

Module・Packageの仕組みを理解する

Go言語では、**Module(モジュール)Package(パッケージ)**を使ってプログラムを整理し、管理することが重要です。本記事では、これらの基本的な概念、実装方法、変数のスコープ、パッケージの定義方法について詳しく解説します。


1. Module(モジュール)とは?

モジュールの概要

Goのモジュールは、プロジェクト全体を管理する単位であり、外部ライブラリの管理にも使用されます。モジュールは go.mod というファイルによって定義されます。

モジュールの作成手順

  1. プロジェクトフォルダを作成
  2. go mod init <モジュール名> を実行
  3. 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 パッケージから利用できますが、subtractcalculator パッケージ内でのみ使用可能です。


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 mainmain.go で実行可能プログラムを作成するための特別なパッケージ
大文字/小文字のルール大文字 → エクスポート(公開) / 小文字 → 非公開
外部パッケージgo get でインストールし、import で使用