Aunque no es extremadamente eficiente, la única solución legible es
//split by separator and pick the first one.
//This has all the characters till null excluding null itself.
retByteArray := bytes.Split(byteArray[:], []byte{0}) [0]
// OR
//If you want a true C-like string including the null character
retByteArray := bytes.SplitAfter(byteArray[:], []byte{0}) [0]
Ejemplo completo para tener una matriz de bytes de estilo C:
package main
import (
"bytes"
"fmt"
)
func main() {
var byteArray = [6]byte{97,98,0,100,0,99}
cStyleString := bytes.SplitAfter(byteArray[:], []byte{0}) [0]
fmt.Println(cStyleString)
}
Ejemplo completo para tener una cadena de estilo ir excluyendo los nulos:
package main
import (
"bytes"
"fmt"
)
func main() {
var byteArray = [6]byte{97,98,0,100,0,99}
goStyleString := string( bytes.Split(byteArray[:], []byte{0}) [0] )
fmt.Println(goStyleString)
}
Esto asigna una porción de porción de bytes. Por lo tanto, vigile el rendimiento si se usa en gran medida o repetidamente.
^@
no se muestra, pero hubiera estado allí si lo probaras en la terminal o algo similar. La razón de esto es que Go no deja de convertir la matriz de bytes en una cadena cuando encuentra un 0.len(string(bytes))
en su ejemplo es 5 y no 1. Depende de la función de salida, si la cadena está totalmente (con ceros) impresa o no.