funcString2Bytes(sstring)[]byte{// StringData获取string的底层数组指针,unsafe.Slice通过指针和长度构建切片returnunsafe.Slice(unsafe.StringData(s),len(s)) }funcBytes2String(b []byte)string{// SliceData获取切片的底层数组指针,unsafe.String通过指针和长度构建stringreturnunsafe.String(unsafe.SliceData(b)...
[]byte转string: b:=[]byte{'h','e','l','l','o'}s:=string(b) 强转换 (有风险 谨慎使用) 在go版本<1.20中 通过unsafe包和reflect包实现,其主要原理是拿到底层数组的指针,然后转换成[]byte或string。 funcString2Bytes(sstring)[]byte{sh:=(*reflect.StringHeader)(unsafe.Pointer(&s))bh:=refl...
T) { x := []byte("Hello Gopher!") y := Bytes2String(x) z := string(x) if y != z { t.Fail() } } // 测试强转换功能 func TestString2Bytes(t *testing.T) { x := "Hello Gopher!" y := String2Bytes(x) z := []byte(x) if !bytes.Equal(y, z) { t.Fail() } }...
rune是int32的别名,代表字符的Unicode编码,采用4个字节存储,将string转成rune就意味着任何一个字符都用4个字节来存储其unicode值,这样每次遍历的时候返回的就是unicode值,而不再是字节了,这样就可以解决乱码问题了 byte bytes操作的对象也是字节切片,与string的不可变不同,byte是可变的,因此string按增量方式构建字符串...
// string to []bytes1:="hello"b:=[]byte(s1)// []byte to strings2:=string(b) 但有时在开源代码中,我们会看到如下的 []byte 和 string 互转的代码: funcString2Bytes(sstring)[]byte{sh:=(*reflect.StringHeader)(unsafe.Pointer(&s))bh:=reflect.SliceHeader{Data:sh.Data,Len:sh.Len,Cap...
// string to []byte s1 := "hello" b := []byte(s1) // []byte to string s2 := string(b) 强转换 通过unsafe 和 reflect 包,可以实现另外一种转换方式,我们将之称为强转换(也常常被人称作黑魔法)。 func String2Bytes(s string) []byte { ...
string与byte的转换是最常见的一种,通常我们会使用强转方式,但其实还有另一种更加高效的方式,本文会演示两种转换方式。 普通转换 func main() { fmt.Println([]byte("abcd")) fmt.Println(string([]byte{'1', '2', '3'})) } 输出 [97 98 99 100] 123 高效转换 上面的转换虽然简单,但是效率不高...
1 写一个字符串string和字节数组[]byte相互转换的demo,该demo很简单、容易理解;注意最后一行的赋值语句仅仅是为了避免编译错误哦,如果没这句编译时将报未使用变量b的编译错误。2 编译程序:go build -gcflags "-m -l -N",其中-l -N禁止了一切优化;编译成功后用gdb加载程序查看string和[]byte的数据结构;...
[]byte的底层定义(src/runtime/slice.go): {代码...} 二者都包含一个指向底层数组的指针,和底层数组的长度。不同点在于:
[]byte转string更简单,直接转换指针类型即可,忽略cap字段 实现如下:funcstringTobyteSlice(sstring)[]byte{tmp1:=(*[2]uintptr)(unsafe.Pointer(&s))tmp2:=[3]uintptr{tmp1[0],tmp1[1],tmp1[1]}return*(*[]byte)(unsafe.Pointer(&tmp2))}funcbyteSliceToString(bytes[]byte)string{...