本記事はGo Advent Calendar 2022の16日目の記事です。
samber/loに三項演算子のようなコードを書くことができる関数が在ることをしったので紹介します。
samber/lo
とは
samber/lo
は,多種多様な便利関数を提供するパッケージです。
JavaScriptのライブラリのLodash
ライクであるとREADMEにも記載があります。
個人的には大好きなパッケージでして,Map
,Filter
等のスライスを操作する関数をよく使っています。
https://github.com/samber/lo
https://github.com/lodash/lodash
Ternary
アドベントカレンダーのネタ探しにsamber/lo
のREADMEを眺めていたところTernary
という関数があることを知りました。
この関数を用いると三項演算子のようなコードを書くことができます。
count := 1
// 第一引数が真であれば第二引数の値を返す。
// 第一引数が偽であれば第三引数の値を返す。
resultA := lo.Ternary(count > 0, "ok", "ng")
resultB := lo.Ternary(count > 10, "ok", "ng")
fmt.Println(resultA) // ok
fmt.Println(resultB) // ng
また,ジェネリックな関数であり,戻り値の型はコンパイル時に決定します。
lo.Ternary(count > 0, 1, 0)
lo.Ternary(count > 0, []int{1}, nil)
TernaryF
Ternary
の第二,第三引数は型パラメータとして渡される型の値である必要がありました。
値を生成するコストが高い場合もあるかと思うので,生成処理は真偽値の判定後に行いたいですね。
そういったケースではTernaryF
を使用するのが良さそうです。
実際に呼び出される関数はどちらか一方となる為,不要な値の生成処理は実行されることはありません。
count := 1
// 第一引数が真であれば第二引数の関数を呼び出し戻り値を返す。
// 第一引数が偽であれば第三引数の関数を呼び出し戻り値を返す。
resultA := lo.TernaryF(count > 0, func() string { return "ok" }, func() string { return "ng" })
resultB := lo.TernaryF(count > 10, func() string { return "ok" }, func() string { return "ng" })
fmt.Println(resultA) // ok
fmt.Println(resultB) // ng
おわりに
今回紹介したものの他にもsamber/lo
には様々な場面で使用できるヘルパーがサポートされています。
samber/lo
に置き換えられる独自実装関数がきっとまだまだ在るはず...