แม้ว่าจะไม่ได้ประสิทธิภาพมากนัก แต่โซลูชันเดียวที่อ่านได้คือ
//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 ยกเว้นค่า 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)
}
สิ่งนี้จะจัดสรรส่วนแบ่งของไบต์ ดังนั้นจับตาดูประสิทธิภาพหากมีการใช้งานหนักหรือซ้ำ ๆ
^@
จะไม่แสดง แต่มันน่าจะอยู่ที่นั่นถ้าคุณทดสอบในอาคารหรือสิ่งที่คล้ายกัน เหตุผลนี้คือว่า Go จะไม่หยุดการแปลงอาร์เรย์ไบต์เป็นสตริงเมื่อพบ 0len(string(bytes))
ในตัวอย่างของคุณคือ 5 และไม่ใช่ 1 ขึ้นอยู่กับฟังก์ชันเอาต์พุตไม่ว่าจะเป็นสตริงที่พิมพ์เต็ม (ด้วยศูนย์) หรือไม่.