Go 1.20 のリリースノートを眺めました。Go 1.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だと長さが違う配列は別の型となるようでした。コンパイルエラーになる方がより安全でよさそうな感じがします。