首頁  >  文章  >  後端開發  >  如何在不進行記憶體複製的情況下從 Go 中的字串中檢索位元組片?

如何在不進行記憶體複製的情況下從 Go 中的字串中檢索位元組片?

Patricia Arquette
Patricia Arquette原創
2024-11-02 10:59:02757瀏覽

How Can I Retrieve a Byte Slice from a String in Go Without Memory Copying?

使用Unsafe 從字串中擷取位元組切片而不進行記憶體複製

問題:

您需要轉換字串到位元組切片,而不會導致記憶體複製的效能損失,特別是在處理大型資料集時。

答案:

第1 步:了解記憶體複製問題

Go 中的字串是不可變的,這意味著它們不能就地修改。因此,使用 []byte(string) 語法將字串轉換為位元組切片會產生記憶體副本。

第 2 步:使用 Unsafe

防止記憶體複製複製,可以採用不安全的操作。 unsafe String 函數可用來檢索指向底層字串資料的指標。

<code class="go">import "unsafe"

func unsafeGetBytes(s string) []byte {
    return (*[0x7fff0000]byte)(unsafe.Pointer(
        (*reflect.StringHeader)(unsafe.Pointer(&s)).Data),
    )[:len(s):len(s)]
}</code>

說明:

  • unsafe.String 函數傳回一個指向字串資料的指標。
  • 指標被轉換為大位元組數組([0x7fff0000]byte)。 Go 允許不安全地轉換為未指定大小的陣列。
  • 然後使用該陣列建立與字串長度相同的位元組切片。

其他注意事項:

  • 此方法只能用於不關心不變性的內部操作。
  • 對於一般字串處理、WriteString 或循環最佳化(如問題描述所述)效率更高。
  • 使用 gzip 壓縮大型資料集可能會掩蓋避免記憶體複製帶來的效能提升。

以上是如何在不進行記憶體複製的情況下從 Go 中的字串中檢索位元組片?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn