golang 如何通过unsafe.Pointer uintptr来实现string与byte互转
主要是对unsafe.Pointer uintptr的一个应用实例,顺便了解golang的string与slice底层是怎样实现的
func Str2bytes(s string) []byte {
x := (*[2]uintptr)(unsafe.Pointer(&s))
h := [3]uintptr{x[0], x[1], x[1]}
return *(*[]byte)(unsafe.Pointer(&h))
}
func Bytes2str(b []byte) string {
return *(*string)(unsafe.Pointer(&b))
}
Str2bytes
:方法代码解释
// 如果了解string底层实现,就明白了。string底层其它就是一个结构体
// string 底层实现
type stringStruct struct {
str unsafe.Pointer
len int
}
x := (*[2]uintptr)(unsafe.Pointer(&s)) //返回的是string的struct信息,x[0]:是s的首指针[对应对应底层str],x[1]:对应字符串的长度[对应底层len]
// 再来看下slice的底层实现
type slice struct {
array unsafe.Pointer
len int
cap int
}
// 结合slice底层,下面这句代码就明白了吧
h := [3]uintptr{x[0], x[1], x[1]} // unsafe.Pointer转换后,x[0]对应array指针,x[1]对应len,x[2]:对应cap
到此这篇关于“golang 如何通过unsafe.Pointer uintptr来实现string与byte互转”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!
您可能感兴趣的文章:
Golang指针的使用限制和unsafe.Pointer的突破之路
golang byte转string_golang面试题:怎么避免内存逃逸?
Golang是否真的没有指针运算?
golang unsafe实践与原理
golang sync/atomic
go字符串转byte_高频golang面试题:字符串转成byte数组,会发生内存拷贝吗?
Go的内存对齐和指针运算详解和实践
bytebuffer怎么转成string_golang面试题:怎么避免内存逃逸?
golang 切片包含_golang面试题:怎么避免内存逃逸?
golang slice 和 string 重用