【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ループがないことで読みやすさも上がったと思います。こういった新しい機能を取り入れて、コードの可読性を向上させていきたいです。
この記事を書いた人
-
これまで農業、士業と経験し、まったく異業種のエンジニアとしてアーティスに入社。
現在は事業開発部でバックエンドエンジニアとして仕事に従事。可読性の高いコードが書けるよう日々勉強中。趣味は一人旅。
関連記事
最新記事
FOLLOW US
最新の情報をお届けします
- facebookでフォロー
- Twitterでフォロー
- Feedlyでフォロー