文字列は不変です。つまり、バイトスライスに変換するにはメモリコピーが含まれることを意味します。これは、大きなデータセットを操作するときにパフォーマンスに影響を与える可能性があります。この記事では、重要な側面と制限を強調しながら、このコピー操作を回避するために安全でないものを使用する方法について説明します。 。メモリ消費が懸念される場合、このオーバーヘッドを発生させることなくバイトスライスを取得することが望ましい。文字列値を一連のバイトへのポインターにキャストすることにより、コピーを作成せずに基礎となるバイトスライスにアクセスできます。 return(*[0x7fff0000] byte)(unsafe.pointer( (*refrect.stringheader)(unsafe.pointer(&s))。データ)、 )[:len(s):len(s)] }
このアプローチには固有のリスクがあることに注意することが重要です。 Goの文字列は不変であるため、UnsafegetBytesを介して取得されたバイトスライスを変更すると、予期しない動作やデータの腐敗さえも発生する可能性があります。したがって、この手法は、メモリパフォーマンスが最も重要な制御された内部環境でのみ使用する必要があります。不確定です。コードが空の文字列に遭遇する可能性がある場合、それらを明示的にチェックすることが不可欠です。 s == ""の場合{ nil //または[] byte {}を返します } return(*[0x7fff0000] byte)(unsafe.pointer( (*refrect.stringheader)(unsafe.pointer(&s))。データ)、 )[:len(s):len(s)] }
この変換はコピーのオーバーヘッドを回避しますが、Gzipwriterを使用して言及したような圧縮操作は計算上集中していることに留意することが不可欠です。メモリコピーを回避することからの潜在的なパフォーマンスの向上は、圧縮に必要な計算と比較して無視できる場合があります。 .Writerコピー操作を呼び出すことなく。関数は、io.writerに執筆方法の存在をチェックし、利用可能な場合はそれを呼び出します。 && &&]
[Go Github Issue 25484](https://github.com/golang/go/issues/25484)func unsafeGetBytes(s string) []byte {
return (*[0x7fff0000]byte)(unsafe.Pointer(
(*reflect.StringHeader)(unsafe.Pointer(&s)).Data),
)[:len(s):len(s)]
}
[[] byte(string)vs [] byte(*string )](https://stackoverflow.com/questions/23369632/)
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3