いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-406 (最初のゼロ値ではない値を返す)(cmp.Or, go 1.22で追加)

関連記事

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。忘れないうちにメモメモ。。

Go 1.22 で、cmp.Or という関数が追加されていたのですね。知らなかったです。

https://pkg.go.dev/cmp#Or

引数に指定した値の中で、最初にゼロ値ではない値を返してくれます。これ便利ですねー。痒いところに手が届く系の関数。

無くても困らないのですが、あるとちょっと処理が楽出来るようになるので便利。

複合キーでソート処理書くときもちょっと楽になりますね。

サンプル

package cmpop

import (
    "cmp"

    "github.com/devlights/gomy/output"
)

// Or は、cmp.Or[T comparable]() のサンプルです。
// cmp.Or は、Go 1.22 で追加されました。
//
// > Or returns the first of its arguments that is not equal to the zero value. If no argument is non-zero, it returns the zero value.
//
// > (Orは、引数のうちゼロ値ではない最初の引数を返す。どの引数もゼロ値ではない場合、ゼロ値を返す。)
//
// comparableが対象となるので、以下に対して利用できる。
//
//   - booleans
//   - numbers
//   - strings
//   - pointers
//   - channels
//   - arrays of comparable types
//   - structs whose fields are all comparable types
//
// # REFERENCES
//   - https://pkg.go.dev/cmp#Or
//   - https://pkg.go.dev/builtin#comparable
//   - https://blog.carlana.net/post/2024/golang-cmp-or-uses-and-history/
func Or() error {
    type (
        V struct {
            Val int
        }
    )
    var (
        ints = []int{0, 0, 99, 1, 0}
        strs = []string{"", "hello", "world", ""}
        objs = []*V{nil, {999}, nil}
    )

    output.Stdoutl("[non-zero]", cmp.Or(ints...))
    output.Stdoutl("[non-zero]", cmp.Or(strs...))
    output.Stdoutl("[non-zero]", cmp.Or(objs...))

    return nil
}

try-golang/examples/basic/cmpop/or.go at main · devlights/try-golang · GitHub

実行すると以下のようになります。

$ task
task: [build] go build .
task: [run] ./try-golang -onetime

ENTER EXAMPLE NAME: cmpop_or

[Name] "cmpop_or"
[non-zero]           99
[non-zero]           hello
[non-zero]           &{999}


[Elapsed] 45.16µs

参考情報

https://pkg.go.dev/cmp#example-Or

https://pkg.go.dev/cmp#example-Or-Sort

Goのおすすめ書籍


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。