Chociaż nie jest to wyjątkowo wydajne, jedynym możliwym do odczytania rozwiązaniem jest
//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]
Pełny przykład posiadania tablicy bajtów w stylu 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)
}
Pełny przykład posiadania łańcucha stylu go z wyłączeniem wartości null:
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)
}
To przydziela plasterek bajtu. Miej oko na wydajność, jeśli jest intensywnie lub wielokrotnie używana.
^@
nie pokazuje się, ale byłoby tam, gdybyś przetestował to w terminalu lub coś podobnego. Powodem tego jest to, że Go nie przestaje konwertować tablicy bajtów na ciąg, gdy znajdzie 0.len(string(bytes))
w twoim przykładzie jest 5, a nie 1. To zależy od funkcji wyjściowej, czy ciąg zostanie wydrukowany w całości (z zerami) albo nie.