Penukaran Tidak Selamat daripada []bait kepada String in Go: Akibat dan Langkah Berjaga-jaga
Semasa menukar []bait kepada rentetan, pendekatan yang disyorkan melibatkan membuat salinan kepingan bait, seperti yang dilihat dalam coretan kod berikut:
var b []byte // Fill b s := string(b)
Walau bagaimanapun, dalam senario di mana prestasi adalah penting, sesetengah pembangun mungkin mempertimbangkan untuk menggunakan kaedah penukaran yang tidak selamat:
var b []byte // Fill b s := *(*string)(unsafe.Pointer(&b))
Walaupun kaedah ini mungkin kelihatan cekap, ia membawa potensi perangkap.
Akibat Penukaran Tidak Selamat
Contoh yang menggambarkan isu:
Pertimbangkan kod berikut:
package main import ( "fmt" "strconv" "unsafe" ) func main() { 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) } } }
Before: map[hi:999] After: map[bi:NULL] But it's there: 999 999 Now it's GONE: 0 0 But still there, just in a different bucket: bi 999
Atas ialah kandungan terperinci ## Adakah Penukaran Tidak Selamat daripada []bait kepada String in Go Benar-benar Berbaloi dengan Risiko?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!