Just Cast Away
固定長の配列(
array
)を可変長の配列(slice
)にしたい。
しかし、スライスにキャスト(型変換)してもエラーが出ます。
つまり、[size]T
の配列を、[]T
のスライスに変換したいのです。
キャストできない例
foo := [64]byte{}
bar := []byte(foo)
// Output: cannot convert foo (type [64]byte) to type []byte
stringにキャストできない例
foo := [16]byte{}
bar := string(foo)
// Output: cannot convert foo (type [16]byte) to type string
わかっちゃえば何てことないのですが、「"golang" byteの配列を文字列に変換」でググっても、タイトルからは []byte
のスライスを string
にキャストする方法しか出てこなかったので、自分のググラビリティとして。
TL; DR (今北産業)
-
[:]
を使ってslicing
する(スライスとして配列を参照させる) -
foo[:]
はfoo[0:len(foo)]
と同等 -
オンラインで以下の動作を見る @ Go Playground
foo := [64]byte{} // 配列として領域を確保する bar := foo[:] // bar は foo の領域を参照する baz := string(bar) // []byte を string にキャスト // 型を確認する fmt.Printf("%T\n", foo) fmt.Printf("%T\n", bar) fmt.Printf("%T\n", baz) hoge := [128]string{} fuga := hoge[:] // 型を確認する fmt.Printf("%T\n", hoge) fmt.Printf("%T\n", fuga) // Output: // [64]uint8 // []uint8 // string // [128]string // []string
参考文献
- Slice defaults | A Tour of Go @ Go.DEV
- Slices | Go Slices: usage and internals | Blog @ Go.DEV
- How to compare [32]byte with []byte in golang? @ StackOverflow
- Golang: 配列からスライスに変換する @ something tech
- Goのarrayとsliceを理解するときがきた @ Qiita