パッケージ (Go入門連載 第1回)
シリーズの目次
プログラムの基本形
Goのプログラムは、パッケージ定義部やインポート部、関数定義部によって構成されます。
関数部に関してはCやC++などの関数の定義方法とそこまで変わりはないので説明は省略します。
今回はパッケージに関することを中心にお話していきます。
// ↓パッケージ定義部
package main
// ↓インポート部
import "fmt"
// ↓関数定義ぶ
func main() {
fmt.Printf("hello Go\n")
}
パッケージとは
Goのプログラムは、パッケージという単位で、複数のソースコードを管理しています。
この説明だけだと分かりづらいと思うので、次の例を見ながら確認していきましょう。
./ --- main.go
|- subMain.go
|--- src/ --- myPack/ --- myPack.go
この図はカレントディレクトリに main.go
と subMain.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.go
は package 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