😎

go で pointer 値をマップする

に公開

以下のような三項演算子を模したコードを書いていた

package operator

func TernaryFunc[T any](cond bool, a func() T, b func() T) T {
	if cond {
		return a()
	}
	return b()
}

func Ternary[T any](cond bool, a T, b T) T {
	return TernaryFunc(cond, func() T { return a }, func() T { return b })
}

利用ケースとしては、nilable な値を変更したい、みたいなケースだ

Category:       operator.TernaryFunc(m.Category != nil, func() *string { return ptr.Of(m.Category.String()) }, func() *string { return nil }),

けど、pointer 値を Map できればいいだけだと気づいた

package ptr

func Of[T any](val T) *T {
	return &val
}
func Map[T any, U any](ptr *T, f func(T) U) *U {
	if ptr == nil {
		return nil
	}
	u := f(*ptr)
	return &u
}

これがあると、先のコードは次の様になる

Category:       ptr.Map(m.Category, func(c model.AnnouncementCategory) string { return c.String() }),

よかったですね

Discussion