Go言語(golang)のパッケージ

※当サイトではアフィリエイト広告を利用しています

目次

Go言語(golang)のパッケージとは

Golangのパッケージは、プログラムコードを整理して再利用しやすくするための仕組みです。プログラムコードを小さなかたまりに分けることで利便性があがります。

パッケージとは英語で一般的に物や情報をまとめたもの、包装された商品という意味です。

引っ越しするときの荷造りで考えます。ダンボールをリビング用、キッチン用、トイレ用などダンボールを分けると管理しやすいですよね。これが同じダンボールに入っていたら、わかりにくいです。

プログラムも同じで用途ごとに分けて管理したほうがわかりやすくなります。

パッケージの考え方

  1. コードをまとめる: プログラムが大きくなると、全部を一つのファイルに書くのは難しいです。そこで、関連するコードをまとめて「パッケージ」という小さな部品に分けます。
  2. 使い回す: 同じコードを何度も書くのは面倒です。パッケージを使うと、同じ機能を他のプログラムでも使い回せます。例えば、日付や計算の機能をパッケージにまとめておいて、他のプログラムで便利に使えます。

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() ファンクション(関数)を定義する
    • パッケージに機能を追加できる
    • 例)電卓というパッケージがあった場合に、機能「足し算」、機能「引き算」を追加するイメージ

fmtmath/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 パッケージの関数や変数をプログラム内で使用できるようになります。

インポートのポイント:

  1. ダブルクォートでパッケージ名をくくる: import ステートメントでは、ダブルクォートでパッケージ名をくくります。例えば、"fmt" といった形です。
  2. パッケージ名は小文字で: Goのパッケージ名は一般的に小文字で始まります。大文字で始まる名前は外部に公開されているもので、小文字で始まるものは外部に公開されていません。
  3. インポートしたパッケージの関数や変数は、パッケージ名をプレフィックスとして使用: 例えば、fmt.Println のように、fmt パッケージの関数 Println を呼び出します。
  4. パッケージのエイリアス: インポート時にエイリアスをつけることもできます。例えば、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

この例では、ExportedVarExportedFunction は外部のパッケージからアクセス可能な名前です。これに対して、privateVar は小文字で始まっているため、このパッケージ内でのみアクセス可能な非エクスポート名となります。

外部のパッケージが example パッケージを使う場合、example.ExportedVarexample.ExportedFunction() のようにエクスポートされた名前にアクセスできます。しかし、example.privateVar にはアクセスできません。

// main.go
package main

import (
    "fmt"
    "example"
)

func main() {
    // エクスポートされた変数にアクセス
    example.ExportedVar = 42

    // エクスポートされた関数を呼び出し
    example.ExportedFunction()

    // エラー: 非エクスポートされた変数にはアクセスできない
    // example.privateVar = "private"
}

このように、エクスポートされた名前は他のパッケージからアクセスできる公開の要素を示します。これにより、パッケージを利用する他のコードが特定の名前にアクセスでき、再利用や拡張性が向上します。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

テック企業でプレイングマネージャーをしている Jun です。プログラミングの基礎をはじめ、組織やマネジメントについてブログを書いています。ハードスキル、ソフトスキルどちらも磨きたい方を対象にしています。一緒に学んで人生を楽しくしていきましょう!

目次