Dans Go, la méthode préférée pour convertir une tranche d'octets ([]octet) en chaîne est :
<code class="go">var b []byte // fill b s := string(b)</code>
Cette approche facilite la copie de tranches d'octets, ce qui peut s'avérer problématique dans des situations critiques en termes de performances.
Cependant, pour de tels scénarios, une conversion non sécurisée peut être envisagée :
<code class="go">var b []byte // fill b s := *(*string)(unsafe.Pointer(&b))</code>
Conséquences d'une conversion non sécurisée
Bien qu'une conversion non sécurisée puisse effectivement améliorer les performances, elle risque de violer la garantie d'immuabilité des chaînes dans Go. La modification d'une chaîne que la spécification du langage s'attend à être immuable peut entraîner un comportement inattendu. Voici quelques conséquences potentielles :
<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>
Après avoir modifié le premier octet de la chaîne en « b », il devient introuvable en utilisant la clé d'origine ou la clé modifiée. Cependant, la chaîne modifiée existe toujours dans la carte, bien que dans un compartiment différent.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!