Open8
Go Genericsで作る小さくて便利なモノたち
ここで作ったものは handy という名前でライブラリにしておこうと思います。毎回自分で書くのが面倒だなという方はご活用いただければ幸いです。なおテストは随時追加していきますのでv1になるまでは Caveat emptor。
インラインポインタ初期化
実装
func New[T any](v T) *T {
return &v
}
使い方
p := handy.New(42)
fmt.Println(*p) // 42
簡易スライス初期化
実装
func Slice[T any](elements ...T) []T {
return elements
}
使い方
ss := handy.Slice("foo", "bar")
fmt.Println(ss) // [foo bar]
三項演算
実装
func Tern[T any](cond bool, truthy, falsey T) T {
if cond {
return truthy
}
return falsey
}
使い方
c := handy.Tern(true, "foo", "bar")
fmt.Println(c) // foo
複数返り値からエラーだけ取り出す
実装
func UnpackError[T any](_ T, err error) error {
return err
}
使い方
w := iomock.ErrOnCallWriter(1, iomock.ErrWrite)
err := handy.UnpackError(io.WriteString(w, "foobar"))
fmt.Println(err) // write error
汎用Must
実装
// Must panics if err is not nil. Otherwise val is returned.
func Must[T any](val T, err error) T {
if err != nil {
panic(err)
}
return val
}
使い方
fmt.Println(handy.Must(func() (int, error) { return 42, nil })) // 42
一行で書ける errors.As
実装
func As[Error error](err error) (Error, bool) {
var as Error
ok := errors.As(err, &as)
return as, ok
}
使い方
エラーの型
type TestError string
func (s TestError) Error() string {
return string(s)
}
in := fmt.Errorf("wrap: %w", TestError("error"))
fmt.Println(handy.As[TestError](in)) // error true
エラーの型識別
実装
func IsType[Error error](err error) bool {
_, ok := As[Error](err)
return ok
}
使い方
in := fmt.Errorf("wrap: %w", TestError("error"))
fmt.Println(handy.IsType[TestError](in)) // true