String 固定字节片到字符串的转换-忽略空值
是否有有效的方法将固定字节片转换为字符串而不向字符串中添加空字符 从字节片转换字符串的传统方法如下:String 固定字节片到字符串的转换-忽略空值,string,go,String,Go,是否有有效的方法将固定字节片转换为字符串而不向字符串中添加空字符 从字节片转换字符串的传统方法如下: out := string(b[STRIDX:STRIDX+STRLEN]) 当返回字符串时,长度始终等于字节片长度。因此,虽然字符串在Print语句中看起来很正常,但它仍然引用潜在的空值。如果将字符附加到此字符串中,则会产生一些非常奇怪的效果 现在,我扫描字节片中的空值,以限制我提供给string的字节片。不是很漂亮或者效率不高 示例:编写一个简单函数: func CToGoString(
out := string(b[STRIDX:STRIDX+STRLEN])
当返回字符串时,长度始终等于字节片长度。因此,虽然字符串在Print
语句中看起来很正常,但它仍然引用潜在的空值。如果将字符附加到此字符串中,则会产生一些非常奇怪的效果
现在,我扫描字节片中的空值,以限制我提供给string
的字节片。不是很漂亮或者效率不高
示例:编写一个简单函数:
func CToGoString(b []byte) string {
i := bytes.IndexByte(b, 0)
if i < 0 {
i = len(b)
}
return string(b[:i])
}
此代码的哪一部分会导致效率问题<代码>字节。索引将是查找第一个空字节的最快方法。我必须仅为此操作导入
bytes
包,这是效率低下的。另外,我希望这应该可以通过内置的来修复。您可能已经在程序中内置了各种字节包函数,因为它在std库中使用。您可以在片上循环并自己查找字节,但是bytes.IndexByte
函数是在汇编中编写的,因为它经常使用。像这样使用数组是比较少见的,所以没有真正的理由在语言中内置一些东西。听起来不错,谢谢。
package main
import (
"bytes"
"fmt"
)
func CToGoString(b []byte) string {
i := bytes.IndexByte(b, 0)
if i < 0 {
i = len(b)
}
return string(b[:i])
}
const (
BUFLEN = 50
STRLEN = 10
STRIDX = 10
)
func main() {
test := "test"
b := [BUFLEN]byte{}
fmt.Printf("Original\n\tString: '%+v' with length '%d'\n", test, len(test))
copy(b[10:], []byte(test))
s := CToGoString(b[STRIDX : STRIDX+STRLEN])
fmt.Printf("Unpacking with []byte()\n\tString: '%+v' with length '%d' Buf:%+v\n", s, len(s), []byte(s))
}
Original
String: 'test' with length '4'
Unpacking with []byte()
String: 'test' with length '4' Buf:[116 101 115 116]