2024/02/13 22:13:39

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 の テスティングフレームワークは他にもあるようす。

サイト内検索