😎
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