Dalam Go, kaedah pilihan untuk menukar kepingan bait ([]bait) kepada rentetan ialah:
<code class="go">var b []byte // fill b s := string(b)</code>
Pendekatan ini memudahkan penyalinan kepingan bait, yang mungkin terbukti bermasalah dalam situasi kritikal prestasi.
Walau bagaimanapun, untuk senario sedemikian, penukaran yang tidak selamat boleh dipertimbangkan:
<code class="go">var b []byte // fill b s := *(*string)(unsafe.Pointer(&b))</code>
Akibat Penukaran Tidak Selamat
Walaupun penukaran yang tidak selamat sememangnya boleh meningkatkan prestasi, ia berisiko melanggar jaminan kebolehubahan rentetan dalam Go. Mengubah suai rentetan yang spesifikasi bahasa jangkakan tidak boleh diubah boleh membawa kepada tingkah laku yang tidak dijangka. Berikut ialah beberapa kemungkinan akibat:
<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>
Selepas mengubah suai bait pertama rentetan kepada 'b', ia menjadi tidak dapat ditemui menggunakan sama ada kekunci asal atau diubah suai. Walau bagaimanapun, rentetan yang diubah suai masih wujud dalam peta, walaupun dalam baldi yang berbeza.
Atas ialah kandungan terperinci ## Bila dan Mengapa Anda Perlu Mengelakkan Penukaran `tidak selamat` daripada `[]bait` kepada `rentetan` dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!