グローバルナビゲーションへ

本文へ

フッターへ

お役立ち情報Blog



【Go】最近のリリースで追加された新しい機能について調べてみた(min関数,max関数、clear関数、rangeを使ったforループの新機能)

以前記事にした機能の他にも最近のリリースで実装された新しい機能があるため、そちらについても調べてみました。

min関数, max関数

min関数は、引数の中から最小値を返します。
第二引数は可変長引数なので、3つ以上の値を比較することが可能ですが、スライスを展開しようとするとエラーになるようです。

x := 1
y := 2
fmt.Println(min(x, y)) // 1

z := 0
fmt.Println(min(x, y, z)) // 0

// 文字列も可能
a := "チューリップ"
b := "あじさい"
c := "さくら"
fmt.Println(min(a, b, c)) // あじさい

// 以下はエラーになる
//s := []int{5, 8, 90}
//fmt.Println(min(x, s...)) // invalid operation: invalid use of ... with built-in min

max関数は、引数の中から最大値を返します。
こちらもminと同じくスライスを展開しようとするとエラーになります。

x := 1
y := 2
fmt.Println(max(x, y)) // 2

z := 0
fmt.Println(max(x, y, z)) // 2

// 文字列も可能
a := "チューリップ"
b := "あじさい"
c := "さくら"
fmt.Println(max(a, b, c)) // チューリップ

// こちらも以下はエラーになる
//s := []int{5, 8, 90}
//fmt.Println(max(x, s...)) // invalid operation: invalid use of ... with built-in min

スライスを含む最小値、最大値を取得した場合は素直にslicesパッケージのMin,Max関数を使えば良さそうです。

x := []int{5, 8, 9, 40}
fmt.Println(slices.Min(x)) // 5
fmt.Println(slices.Max(x)) // 40

clear関数

clear関数はmapやsliceに使用します。mapに使用した場合は空のmapに、sliceに使用した場合はすべてがゼロ値のsliceになります。
nilのmap、nilのsliceに対しては何の操作も行わないようです。

m := map[string]string{
    "一郎": "掃除係",
    "二郎": "洗濯係",
    "三郎": "炊事係",
}
fmt.Println(m) // map[一郎:掃除係 三郎:炊事係 二郎:洗濯係]
clear(m)
fmt.Println(m)        // map[]
fmt.Println(m != nil) // true


s := []string{"一郎", "二郎", "三郎"}
fmt.Println(s) // [一郎 二郎 三郎]
clear(s)
fmt.Println(s) // [  ] ← ゼロ値が三つのスライスになっている
for _, v := range s {
    fmt.Println(v == "") // true true true
}


m = nil
fmt.Println(m) // map[]
clear(m)
fmt.Println(m) // map[] ← 変化なし

rangeを使ったforループの新機能

例えば1から10までカウントアップするコードを書く場合、以前までは以下のようなコードを書く必要がありました。

for i := 1; i <= 10; i++ {
    fmt.Println(i)
}
  • 出力結果
1
2
3
4
5
6
7
8
9
10

しかし、Go1.22からrangeの後に整数リテラルを書く方法で実装できるようになりました。

for i := range 10 {
    fmt.Println(i + 1)
}
  • 出力結果
1
2
3
4
5
6
7
8
9
10

また、rangeの後に負の値を渡した場合はfor内の処理が一度も行われないようです。浮動小数点リテラル、整数ではない型を渡すとエラーになります。

// 一度も処理が行われない
for i := range -1 {
    fmt.Println(i + 1)
}

// エラーになる
//for i := range 10.1 {
//    fmt.Println(i + 1)
//}

// これもエラーになる
//for i := range float64(10) {
//    fmt.Println(i)
//}

さいごに

これらの新機能を使ってコードを書くことで、以前よりも直感的でわかりやすいコードを書けるようになったと思います。
例としてclear関数を使う場合と使わない場合を比べてみます。

// clear関数を使う場合
m1 := map[string]string{"春": "spring", "夏": "summer"}
clear(m1)

// clear関数を使わない場合
m2 := map[string]string{"春": "spring", "夏": "summer"}
for k := range m2 {
    delete(m2, k)
}

clear関数を使う方が書く量も減り、forループがないことで読みやすさも上がったと思います。こういった新しい機能を取り入れて、コードの可読性を向上させていきたいです。

この記事を書いた人

wanderlust
wanderlust事業開発部 web application engineer
これまで農業、士業と経験し、まったく異業種のエンジニアとしてアーティスに入社。
現在は事業開発部でバックエンドエンジニアとして仕事に従事。可読性の高いコードが書けるよう日々勉強中。趣味は一人旅。
この記事のカテゴリ

FOLLOW US

最新の情報をお届けします