golang で package を書いてみる
Go で package ライブラリ を書いてみる。
ライブラリの置き場所
- 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 の テスティングフレームワークは他にもあるようす。