The Gopher character is based on the Go mascot designed by Renée French
はじめに
TIGの辻です。Go1.22連載の2本目です。
この記事では、マイナーアップデートから slices パッケージを取り上げて紹介します。
slices のアップデート内容
- slice を連結する
Concat()
API が追加になった(#56353) - slice の長さを小さくする関数で、破棄された slice の要素をゼロ値とする(#63393)
Insert()
で引数が範囲外の場合に、常に panic させる(#63913)
slice を連結する Concat()
API が追加になった(#56353)
以下の API が追加になりました。渡された slice を連結して新しい slice を返却します
func Concat[S ~[]E, E any](slices ...S) S |
コード例です
package main |
ちなみにGo 1.21ですと appned() では複数の slice を連結できず、slice を unpack して以下のように実装する必要がありました。
package main |
slice の長さを小さくする関数で、破棄された slice の要素をゼロ値とする(#63393)
以下のAPIの機能改善です。slice の長さが小さくなる関数で、破棄すべき slice の要素をゼロ値でクリアするようになっています
- Delete()
- DeleteFunc()
- Compact()
- CompactFunc()
- Replace()
Delete()
のコード例です
Go1.21
package main |
Go1.22
package main |
横道にそれますが Delete()
に関して CL#541477 からコードの変更内容を見てみました。
https://go-review.googlesource.com/c/go/+/541477
変更前は要素を除いた値を appned()
しているだけですが、変更後は明示的に clear()
しています
- 変更前
func Delete[S ~[]E, E any](s S, i, j int) S { |
- 変更後
func Delete[S ~[]E, E any](s S, i, j int) S { |
Insert()
で引数が範囲外の場合に、常に panic させる(#63913)
Insert()
APIの機能改善です。
Go1.21では範囲外の Index が渡されても、挿入する要素が存在しない場合は panic しませんでした。
ただドキュメント上での説明では Insert panics if i is out of range
とあり動きにドキュメントと動作に乖離がありました。
https://pkg.go.dev/slices@go1.21.0#Insert
Go1.21では以下のコードが実行できます
Go1.21
package main |
ただし範囲外の Index に値を追加する場合はGo.1.21でも panic になります
package main |
Go1.22
Go1.22では範囲外の Index が指定されている場合は要素の有無に関わらず、panic するようになります
package main |
おわりに
slices パッケージの機能追加/更新を紹介しました。
slices パッケージはGo1.21で標準ライブラリに追加されましたが、ユーザーに見える/見えにくい内容含めて、まだまだ進化しそうでこれからも楽しみですね