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中是存在指针这个概念的。对于指针很多人有点忌惮(可能是因为之前学习过C语言),因为它会...
    LinkinStar阅读 602评论 0 1
  • 答案是肯定的: 没有指针运算(哈哈, 别着急慢慢往后面看) C或者C++转golang同学就高兴了, 再也不用面试...
    HHFCodeRv阅读 1,792评论 1 2
  • interface 底层实现 空interface 在Go语言的源码位置: src\runtime\runtime...
    youngfn阅读 1,071评论 0 0
  • 本文转至:https://www.cnblogs.com/sunsky303/p/11820500.html un...
    _老七阅读 611评论 0 0
  • 戏份已经落幕的青春 还站在后台等 等下出戏的对白 如何继续扮演 我们 我默背剧本 试图先行找出 那个对的人
    我走阅读 297评论 0 9