LoginSignup
7
1

More than 1 year has passed since last update.

samber/lo で三項演算子っぽくコードが書けるよ

Last updated at Posted at 2022-12-16

本記事は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に置き換えられる独自実装関数がきっとまだまだ在るはず...

7
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1