go语言unsafe.Pointer的使用的一点小疑问

如题

我想知道以下了两种写法有啥不一样的吗,都是string强转[]byte

第一种

func string2Bytes (s string) []byte {
    sh := (*reflect.StringHeader)(unsafe.Pointer(&s))
    bh := reflect.SliceHeader{
        Data: sh.Data,
        Len: sh.Len,
        Cap: sh.Len,
    }
   return *(*[]byte)(unsafe.Pointer(&bh))
}

第二种

func string2Bytes (s string) []byte {
    sh := (*[]byte) (unsafe.Pointer(&s))
    return *sh
阅读 1.4k
1 个回答

第一种是正解,第二种特定情况下不安全,切片的Cap是string范围外的一个值了,可以测试出来。

代码自己跑

package main

import (
    "log"
    "reflect"
    "unsafe"
)

func main() {
    log.Println(cap(string2Bytes1("https://github.com/eudore")))
    log.Println(cap(string2Bytes2("https://github.com/eudore")))

}

func string2Bytes1(s string) []byte {
    sh := (*reflect.StringHeader)(unsafe.Pointer(&s))
    bh := reflect.SliceHeader{
        Data: sh.Data,
        Len:  sh.Len,
        Cap:  sh.Len,
    }
    return *(*[]byte)(unsafe.Pointer(&bh))
}

func string2Bytes2(s string) []byte {
    sh := (*[]byte)(unsafe.Pointer(&s))
    return *sh
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题