Embora não seja de alto desempenho, a única solução legível é
//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]
Exemplo completo para ter uma matriz de bytes no 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)
}
Exemplo completo para ter uma string de estilo go excluindo os 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)
}
Isso aloca uma fatia da fatia de bytes. Portanto, fique de olho no desempenho, se for usado intensamente ou repetidamente.
^@
show não aparece, mas estaria lá se você testasse no terminal ou algo parecido. A razão para isso é que o Go não para de converter a matriz de bytes em uma cadeia de caracteres quando encontra um 0.len(string(bytes))
no seu exemplo é 5 e não 1. Depende da função de saída, se a cadeia de caracteres é totalmente (com zeros) impressa ou não.