Незважаючи на те, що це не надзвичайно ефективно, єдине читабельне рішення - це
//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]
Повний приклад мати байтовий масив у стилі С:
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 не зупиняє перетворення масиву байтів у рядок, коли знаходить 0.len(string(bytes))
У вашому прикладі є 5, а не 1. Це залежить від функції виводу, чи надруковано повністю (з нулями) рядок чи ні.