tocsatoの備忘録

ほぼほぼ 50 代のプログラマの備忘録。swift golang javascript css html5 nginx mysql などを最近使ってます。

[]byte と string のキャスト

[]byte と string の相互キャストは比較的頻繁に行う作業です。
しかし google:golang cast string to byte slice で分かるように、これらの操作はメモリコピーが走ります。

この記事は、unsafe パッケージを使用して

  • 一時的にキャストしたデータを扱う
  • キャストしたデータは read only で扱う

に限定して、メモリコピーなしに[]byte と string の相互キャストを行う方法を記します。

これらの方法は、golang のいくつかのパッケージでも使用している最適化の1つです。
unsafe.Pointer に記載されている注意事項を守ってご利用下さい。

[]byte を string にキャストする

func bstring(b []byte) string {
	return *(*string)(unsafe.Pointer(&b))
}

string を []byte にキャストする

func sbytes(s string) []byte {
	return *(*[]byte)(unsafe.Pointer(&s))
}

返された []byte は容量の情報が不定です。
絶対にappend()の対象にしないでください