nakaoka3の技術ブログ

2023年中に52本なにか書きます

Goのスライスと配列

Go 1.20 のリリースノートを眺めました。Go 1.20 ではスライスから配列への変換が可能になったようです。

https://go.dev/doc/go1.20

Go 1.17 added conversions from slice to an array pointer. Go 1.20 extends this to allow conversions from a slice to an array: given a slice x, [4]byte(x) can now be written instead of *(*[4]byte)(x).

以下のコードはGo 1.20 だと動きますが、1.19だと cannot convert s (variable of type []byte) to type [4]byte というビルドエラーが出ます。

s := []byte{1,2,3,4}
a := [4]byte(s)
fmt.Println(a)

https://go.dev/play/p/JZVcEtJJhg8?v=goprev

見た目は似ていますが、type []byte は配列ではなく、byteのスライスです。一方で[4]byte は長さ4のbyte配列です。スライスは配列と違って可変長です。

スライスと配列は違う型ですが、Go言語では長さの違う配列も違う型になります。

var arr1 [5]int
var arr2 [4]int
// 配列の長さが違うため、コンパイルエラーになる
arr1 = arr2
fmt.Println(arr1)

静的型付けの言語でも、このように長さの違う配列が違う型となる場合とならない場合があるようです。軽く調べたところRustだと長さが違う配列は別の型となるようでした。コンパイルエラーになる方がより安全でよさそうな感じがします。