post Image
【緩募】Golangでスライスの型のキャストをする方法が知りたい

[]float32[]byteにキャストしたい。けど方法がわからない。

http://qiita.com/mattn/items/176459728ff4f854b165

mattnさんがunsafeを使って、str→[]byteの方法を紹介してくれています。これが応用できないか?

float32だと分かりにくいので、uint16→byteで試してみます。gore上でやってます, 513, 1027という数値の配列をリトルエンディアンでうまくバイトごとに取れると、1, 2, 3, 4という配列になるはずなので、それを目標に。

unsafeで[]uint16を[]byteに

gore> a := []uint16{513, 1027}  // []uint16{0x201, 0x403}
gore> b := *(*[]byte)(unsafe.Pointer(&a[0]))

unexpected fault address 0x4030201
fatal error: fault
[signal 0xa code=0x2 addr=0x4030201 pc=0x5ced6]

だめでした。確かに、スライスは長さ情報を持つオブジェクトで、まったく別のものなのでダメかもしれません。

unsafeで[]uint16を[4]byteに

gore> a := []uint16{513, 1027}  // []uint16{0x201, 0x403}
gore> b := *(*[4]byte)(unsafe.Pointer(&a[0]))
[4]uint8{0x1, 0x2, 0x3, 0x4}

今度は長さ指定の配列に。今度はうまくいったように見えます。固定長配列の[4]byteから[]byteへのキャストは問題なくコピーなしでいけます。じゃあa[0]を変更してみますか。

gore> a[0] = 0
0x0
gore> b
[4]uint8{0x1, 0x2, 0x3, 0x4}

あれ、変わってない。newされてコピーされてしまったようですね。

なお、元データの方を固定長配列にしても結果は同じでした。

今回はコピーがあろうがなかろうが、時間のペナルティはあるもののロジックは正しく動くので(union的にその後お互いにやりとりすることはなくて、OpenGLで送っちゃっておしまいなので)、このコピーは許容範囲ということにしておいてとりあえず作業は進めますが、もしゼロコピー化する方法が分かる方がいらっしゃいましたら教えて下さい。


『 Go 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。