Go言語(golang)のパッケージとは
Golangのパッケージは、プログラムコードを整理して再利用しやすくするための仕組みです。プログラムコードを小さなかたまりに分けることで利便性があがります。
パッケージとは英語で一般的に物や情報をまとめたもの、包装された商品という意味です。
引っ越しするときの荷造りで考えます。ダンボールをリビング用、キッチン用、トイレ用などダンボールを分けると管理しやすいですよね。これが同じダンボールに入っていたら、わかりにくいです。
プログラムも同じで用途ごとに分けて管理したほうがわかりやすくなります。
パッケージの考え方
- コードをまとめる: プログラムが大きくなると、全部を一つのファイルに書くのは難しいです。そこで、関連するコードをまとめて「パッケージ」という小さな部品に分けます。
- 使い回す: 同じコードを何度も書くのは面倒です。パッケージを使うと、同じ機能を他のプログラムでも使い回せます。例えば、日付や計算の機能をパッケージにまとめておいて、他のプログラムで便利に使えます。
Go言語(golang)のパッケージ
「A Tour of Go」では次のようなサンプルになっています。
package main
import (
"fmt"
"math/rand"
)
func main() {
fmt.Println("My favorite number is", rand.Intn(10))
}
実行結果(実行するごとに表示される数字がランダムに変わります)
My favorite number is 2
パッケージの中身解説
package main
と書くことでパッケージを宣言できるimport
を書くことで他のパッケージを呼び出せるようになるfmt
のPrint文を使うと画面に文字を表示したりできるfmt
はフォーマットの略称
math/rand
はランダムな数字を扱える
func main()
ファンクション(関数)を定義する- パッケージに機能を追加できる
- 例)電卓というパッケージがあった場合に、機能「足し算」、機能「引き算」を追加するイメージ
fmt
、math/rand
の詳しい説明を書きますが、現時点では分からなくても大丈夫!
補足:fmtパッケージ
fmt
(フォーマット)は、Go言語の標準パッケージの一部です。フォーマットされた入出力をサポートするためのパッケージです。主にテキストの出力を整形したり、文字列や数値を特定の形式で表示するために使用されます。
主な機能としては、文字列のフォーマット、標準出力への書き込み、標準入力からの読み込みなどがあります。
使用例
package main
import "fmt"
func main() {
// 文字列のフォーマット
name := "Alice"
age := 30
fmt.Printf("Name: %s, Age: %d\n", name, age)
// 標準出力への書き込み
fmt.Println("Hello, Golang!")
// 標準入力からの読み込み
var input string
fmt.Print("Enter something: ")
fmt.Scanln(&input)
fmt.Printf("You entered: %s\n", input)
}
この例では、fmt.Printf
を使って文字列をフォーマットしています。%s
や%d
はそれぞれ文字列と整数のプレースホルダーで、これらは後ろに指定した変数の値に置き換えられます。また、fmt.Println
は標準出力に新しい行を出力し、fmt.Scanln
は標準入力からの入力を受け取ります。
fmt
パッケージは非常に便利で、主にデバッグやユーザーとの対話的な操作、ログの出力などで広く使用されます。
補足:math/randパッケージ
math/rand
パッケージは、Go言語の標準パッケージの一部です。擬似乱数を生成するための機能を提供します。乱数は、ランダムな数値を生成するために使用され、ゲーム、暗号学、シミュレーションなどさまざまな分野で利用されます。
以下に、math/rand
パッケージの基本的な使用例を示します。
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
// 現在時刻をシードにして乱数生成器を初期化
rand.Seed(time.Now().UnixNano())
// 0から99までの乱数を生成
randomNumber := rand.Intn(100)
fmt.Println("Random number:", randomNumber)
}
この例では、rand.Seed(time.Now().UnixNano())
を使用して、ランダム数生成器を現在の時間で初期化しています。これにより、プログラムを実行するたびに異なるシードが使われ、異なる乱数が生成されます。
コンピュータは常に正確に計算します。そのためランダムといっても同じ計算をすれば同じ値が出力されます。そのためランダムにするためにはシード(今回の例では現在時刻)という異なる値を入力値に使うことでランダムになります。
rand.Intn(100)
を使用して、0から99までのランダムな整数を生成しています。
Goの math/rand
パッケージでは、乱数生成器を初期化するために rand.Seed
を呼ぶことが重要です。初期化を省略すると、プログラムを再起動しても同じ乱数の系列が生成されてしまいます。これにより、デバッグのしやすさが向上し、再現性が確保されます。
Go言語(golang)のインポート
import
ステートメントは、他のパッケージからコードを利用するためにGoプログラムで使います。
// main.go
package main
// fmt パッケージをインポート
import "fmt"
func main() {
// fmt パッケージの Println 関数を利用して文字列を出力
fmt.Println("Hello, Golang!")
}
この例では、fmt
パッケージを import
しています。具体的には、"fmt"
という文字列が import
ステートメントの中にあります。これによりfmt
パッケージの関数や変数をプログラム内で使用できるようになります。
インポートのポイント:
- ダブルクォートでパッケージ名をくくる:
import
ステートメントでは、ダブルクォートでパッケージ名をくくります。例えば、"fmt"
といった形です。 - パッケージ名は小文字で: Goのパッケージ名は一般的に小文字で始まります。大文字で始まる名前は外部に公開されているもので、小文字で始まるものは外部に公開されていません。
- インポートしたパッケージの関数や変数は、パッケージ名をプレフィックスとして使用: 例えば、
fmt.Println
のように、fmt
パッケージの関数Println
を呼び出します。 - パッケージのエイリアス: インポート時にエイリアスをつけることもできます。例えば、
import f "fmt"
のようにすると、f.Println
のように短縮して呼び出すことができます。
package main
import f "fmt"
func main() {
f.Println("Hello, Golang!")
}
Go言語(golang)のExported names
Exported names(エクスポートされた名前)は、Go言語において、外部のパッケージからアクセス可能な名前や識別子を指します。Goでは、識別子(変数、関数、型、メソッドなど)の最初の文字が大文字で始まる場合、その識別子は外部のパッケージからアクセス可能なエクスポートされた名前となります。
// example.go
package example
// ExportedVar は外部のパッケージからアクセス可能な変数
var ExportedVar int
// exportedFunction は外部のパッケージからアクセス可能な関数
func ExportedFunction() {
// 何かの処理
}
// privateVar はこのパッケージ内でのみアクセス可能な変数
var privateVar string
この例では、ExportedVar
と ExportedFunction
は外部のパッケージからアクセス可能な名前です。これに対して、privateVar
は小文字で始まっているため、このパッケージ内でのみアクセス可能な非エクスポート名となります。
外部のパッケージが example
パッケージを使う場合、example.ExportedVar
や example.ExportedFunction()
のようにエクスポートされた名前にアクセスできます。しかし、example.privateVar
にはアクセスできません。
// main.go
package main
import (
"fmt"
"example"
)
func main() {
// エクスポートされた変数にアクセス
example.ExportedVar = 42
// エクスポートされた関数を呼び出し
example.ExportedFunction()
// エラー: 非エクスポートされた変数にはアクセスできない
// example.privateVar = "private"
}
このように、エクスポートされた名前は他のパッケージからアクセスできる公開の要素を示します。これにより、パッケージを利用する他のコードが特定の名前にアクセスでき、再利用や拡張性が向上します。