🎒

パッケージ (Go入門連載 第1回)

2021/03/06に公開

シリーズの目次

  1. Goの導入 for MacOS
  2. パッケージ
  3. 変数とデータ型
  4. 条件分岐
  5. ループ処理
  6. 配列
  7. 関数

プログラムの基本形

Goのプログラムは、パッケージ定義部やインポート部、関数定義部によって構成されます。
関数部に関してはCやC++などの関数の定義方法とそこまで変わりはないので説明は省略します。
今回はパッケージに関することを中心にお話していきます。

// ↓パッケージ定義部
package main

// ↓インポート部
import "fmt"

// ↓関数定義ぶ
func main() {
    fmt.Printf("hello Go\n")
}

パッケージとは

Goのプログラムは、パッケージという単位で、複数のソースコードを管理しています。
この説明だけだと分かりづらいと思うので、次の例を見ながら確認していきましょう。

./ --- main.go
    |- subMain.go
    |--- src/ --- myPack/ --- myPack.go

この図はカレントディレクトリに main.gosubMain.go があり、.src/myPack/ の直下に myPack.go があることを示しています。

そして、各ファイルの内容は以下の通りになっています。

  • main.go (package : main)
package main

import "myPack"

func main() {
    subMain()
    myPack.MyFunc()
}
  • subMain.go (package : main)
package main

import "fmt"

func main() {
    fmt.Println("...subMain() called")
}
  • myPack.go (package : myPack)
package myPack

import "fmt"

func MyFunc() {
    fmt.Println("...MyFunc() called")
}

この main.go を実行すると以下のような実行結果になります。

$ go run main.go
> ...subMain() called
> ...MyFunc() called

解説

main.gopackage main と記載してる為,mainパッケージに属しています。
subMain関数は,同じmainパッケージの subMain.go を呼び出しています。

  • main.go (package : main)
package main

import "myPack"

func main() {
    subMain()
    myPack.MyFunc()
}

このようにgo言語では 同じパッケージに所属している場合は、違うファイルであっても、関数を呼び出す際に特別な宣言は不要なのです。

一方で Myfunc関数 の場合は、インポート部でパッケージをインポートする必要があります。そうすることで、インポートしたパッケージに所属しているファイルで定義してある関数が利用可能になります。

その際は、どのインポートしたファイルかを示す必要がある為、関数の実行前にパッケージ名を指定する必要があります。

標準パッケージ

今まで何気なく利用していた fmt というパッケージですが、これはGoに標準で搭載されているパッケージの一つです。Goにはこのような形で便利なパッケージ機能が標準で搭載されているので、必要に応じて利用していきましょう。

以下の表がよく使われる標準パッケージ機能です。

パッケージ 機能
fmt 書式付きプリント機能
io IO関係の基本的な型が定義されている
io/ioutil IO関係の便利機能の提供
strings 文字列に関する処理を提供
bytes stringsパッケージの[]byte版
bufio バッファリングされたIO機能を提供
encoding/binary バイナリエンコードの処理を提供
x/text テキスト処理などを提供
flag コマンドライン引数に関する機能を提供
path/filepath ファイルパスに関係する処理を提供
text/template テンプレート機能を提供
testing テスティングライブラリ
net/http HTTPサーバ/クライアントを提供
net/http/httptest HTTPサーバのテストで使える機能を提供
sync ロックなどの機能を提供
context コンテキスト機能を提供
image 画像処理を提供
x/image 標準パッケージではたりない画像処理機能を提供
reflect リフレクションの機能を提供
go 静的解析の機能を提供

Discussion