Open8

Go Genericsで作る小さくて便利なモノたち

Kotone/NanoKotone/Nano

ここで作ったものは handy という名前でライブラリにしておこうと思います。毎回自分で書くのが面倒だなという方はご活用いただければ幸いです。なおテストは随時追加していきますのでv1になるまでは Caveat emptor。

Kotone/NanoKotone/Nano

インラインポインタ初期化

実装

func New[T any](v T) *T {
	return &v
}

使い方

p := handy.New(42)
fmt.Println(*p) // 42
Kotone/NanoKotone/Nano

簡易スライス初期化

実装

func Slice[T any](elements ...T) []T {
	return elements
}

使い方

ss := handy.Slice("foo", "bar")
fmt.Println(ss) // [foo bar]
Kotone/NanoKotone/Nano

三項演算

実装

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
Kotone/NanoKotone/Nano

複数返り値からエラーだけ取り出す

実装

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
Kotone/NanoKotone/Nano

汎用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
Kotone/NanoKotone/Nano

一行で書ける 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
Kotone/NanoKotone/Nano

エラーの型識別

実装

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