Хотя и не очень производительный, единственное читаемое решение
//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]
Полный пример наличия байтового массива в стиле 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)
}
Полный пример, чтобы иметь строку стиля go, исключая нули:
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)
}
Это выделяет кусочек кусочка байтов. Так что следите за производительностью, если она используется интенсивно или многократно.
^@
не показывается, но он был бы там, если бы вы проверили его в терминале или что-то подобное. Причина этого в том, что Go не прекращает преобразование массива байтов в строку, когда находит 0len(string(bytes))
в вашем примере, а не 1. Это зависит от функции вывода, полностью ли (с нулями) напечатана строка или нет.