🤖

Go1.21のmin・max関数の使い方備忘録

2023/09/08に公開

先日リリースされたgo1.21(23/9/8時点で1.21.1がリリース済)にて3つの新しい関数 min() max() clear() が追加されました。

今回はその中でもmin()max()についてより楽にコードを書くことができるユースケースを備忘録として書いておこうと思います。

min関数とは

pkg.go.devのドキュメントを引用。

The min built-in function returns the smallest value of a fixed number of arguments of cmp.Ordered types. There must be at least one argument. If T is a floating-point type and any of the arguments are NaNs, min will return NaN.

引数はcmp.Ordered型の1個以上任意個の引数を取り、渡された引数の中から最も小さい数を返します。float型でNaNが引数に含まれる際はNaNを返すようです。

v := []int{2, 3, 5, 7, 11}
fmt.Println(min(v...)) // 2

最初は上記のような使い方を想像していましたがどうやらそれはできないようです。

min(v...) // invalid operation: invalid use of ... with built-in min

他の使い方を考えてみる

min関数の活用方法

min関数を活用できるケースを一つ思いついたので共有しようと思います。

任意個の要素を持つスライスを5個ごとのスライスに分割したn番目のスライスを取得したいとき、min関数を用いない場合以下のような実装になります。

var a = []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}
var b []int
n := 2
if len(a) < 5*n {
    b = a
} else {
    b = a[5*(n-1) : 5*n]
}
fmt.Println(b) // [6 7 8 9 10]

冗長ですね。

しかし、min関数を用いる事で下記の通り非常に簡単に書くことができます。

var a []int = []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}
n := 2
b := a[5*(n-1) : min(5*n, len(a))]
fmt.Println(b) // [6 7 8 9 10]

max関数の活用方法(TODO)

最後に

新関数、min() max()を活用してより良いGopherライフを送ってください!

Discussion