在Go 中,將位元組切片([]byte) 轉換為字串首選的方法是:
<code class="go">var b []byte // fill b s := string(b)</code>
這種方法有利於位元組切片複製,這在效能關鍵的情況下可能會出現問題。
但是,對於這種情況,可以考慮不安全的轉換:
<code class="go">var b []byte // fill b s := *(*string)(unsafe.Pointer(&b))</code>
不安全轉換的後果
雖然不安全轉換確實可以提高效能,但它有可能違反Go 中字串的不變性保證。修改語言規範期望不可變的字串可能會導致意外的行為。以下是一些潛在的後果:
<code class="go">m := map[string]int{} b := []byte("hi") s := *(*string)(unsafe.Pointer(&b)) m[s] = 999 fmt.Println("Before:", m) b[0] = 'b' fmt.Println("After:", m) fmt.Println("But it's there:", m[s], m["bi"]) for i := 0; i < 1000; i++ { m[strconv.Itoa(i)] = i } fmt.Println("Now it's GONE:", m[s], m["bi"]) for k, v := range m { if k == "bi" { fmt.Println("But still there, just in a different bucket: ", k, v) } }</code>
將字串的第一個位元組修改為「b」後,無論使用原始鍵或修改後的鍵都無法找到它。但是,修改後的字串仍然存在於地圖中,儘管位於不同的儲存桶中。
以上是## 在 Go 中何時以及為什麼應該避免從 `[]byte` 到 `string` 的`不安全`轉換?的詳細內容。更多資訊請關注PHP中文網其他相關文章!