# golang で package を書いてみる Go で package ライブラリ を書いてみる。 {{TOC 2-}} ## ライブラリの置き場所 * golan の package は `$GOPATH/src` 以下に * `ベースパス + ファイル名` という構成にする ベースパスは、プロジェクトをリポジトリ化して連携をうまくするために、例えば github にリポジトリを置く場合は、`$GOPATH/src/github.com/bayashi` のようにしておく。ただし、最初から公開されることを前提にしていない紳士協定のようなものなので、好きにしてもかまわないがうまくいってる慣例には従っておいた方が吉という感じのようす。 という訳で、今回は `$GOPATH/src/github.com/bayashi/mytut/` をベースパスとして扱う。`bayashi` というところは自分の ID に読み替えてください。 ## 例 与えられた引数に 1 足して返すだけのライブラリ。ベースパスに `lib` を掘ってその中に `plusone.go` として作成 $GOPATH/src/github.com/bayashi/mytut/lib/plusone.go package plusone func Incr(i int) int { return i + 1 } ライブラリは build しとく。 $ go build $GOPATH/src/github.com/bayashi/mytut/lib/plusone.go ライブラリを利用する側はベースパスに `gogotea.go` として作成。このファイルは実はどこにあってもファイル名も適当で OK。 $GOPATH/src/github.com/bayashi/mytut/gogotea.go package main import ( "fmt" "github.com/bayashi/mytut/lib" ) func main() { fmt.Printf("gogotea %v\n", plusone.Incr(1)) } 実行。 $ cd $GOPATH/src/github.com/bayashi/mytut go run gogotea.go gogotea 2 install $ go insatll gogotea.go $ gogotea gogotea 2 ## ライブラリのテスト とりあえず公式の `testing` パッケージを使って `plusone.Incr` をテストしてみる。 $GOPATH/src/github.com/bayashi/mytut/gotest/plusone_test.go package gotest import ( "testing" "github.com/bayashi/mytut/lib" ) func TestIncr(t *testing.T) { if i := plusone.Incr(1); i != 2 { t.Error("failed") } else { t.Log("ok") } } 実行 $ go test gotest/plusone_test.go ok command-line-arguments 0.004s 適当にいじって落としてみる。 $ go test gotest/plusone_test.go --- FAIL: TestIncr (0.00s) plusone_test.go:10: failed FAIL FAIL command-line-arguments 0.005s got と expect みたいな感じでみれないのね。 golang の テスティングフレームワークは他にもあるようす。