golang/%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E7%82%B9/golang%E9%9D%A2%E8%AF%95%E9%A2%98%EF%BC%9A%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%BD%AC%E6%88%90byte%E6%95%B0%E7%BB%84%EF%BC%8C%E4%BC%9A%E5%8F%91%E7%94%9F%E5%86%85%E5%AD%98%E6%8B%B7%E8%B4%9D%E5%90%97%EF%BC%9F #11
Replies: 2 comments
-
|
hello! 有问题随时评论到这里啊! |
Beta Was this translation helpful? Give feedback.
0 replies
-
|
写了代码测试,大家可以参考😁 Go1.20开始旧的方法就被弃用了,建议大家用 文档https://pkg.go.dev/unsafe#StringData https://pkg.go.dev/unsafe#SliceData 在线代码: https://go.dev/play/p/OkiyrCeD67p package main
import (
"fmt"
"reflect"
"unsafe"
)
func str2BytesOld(s string) []byte {
// 获取字符串底层结构体头部指针
ptr := (*reflect.StringHeader)(unsafe.Pointer(&s))
//转换成通用指针类型,然后强制转换成指向字节切片的指针,再取出这个指针指向切片的内容,存入变量bytes中,返回这个变量
bytes := *(*[]byte)(unsafe.Pointer(ptr))
return bytes
}
func str2Bytes(s string) []byte {
//获取指向底层字节数组的指针
ptr := unsafe.StringData(s)
// unsafe.Slice用于从数组指针创建切片
return unsafe.Slice(ptr, len(s))
}
func main() {
a := "helloworl123"
bytes := str2Bytes(a)
bytes2 := str2BytesOld(a)
bytes3 := []byte(a)
// 打印底层数据的地址
fmt.Printf("bytes data address: %x\n", unsafe.SliceData(bytes))
fmt.Printf("bytes2 data address: %x\n", unsafe.SliceData(bytes2))
fmt.Printf("bytes3 data address: %x\n", unsafe.SliceData(bytes3))
} |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment

Uh oh!
There was an error while loading. Please reload this page.
-
golang/%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E7%82%B9/golang%E9%9D%A2%E8%AF%95%E9%A2%98%EF%BC%9A%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%BD%AC%E6%88%90byte%E6%95%B0%E7%BB%84%EF%BC%8C%E4%BC%9A%E5%8F%91%E7%94%9F%E5%86%85%E5%AD%98%E6%8B%B7%E8%B4%9D%E5%90%97%EF%BC%9F
问题 字符串转成 byte 数组,会发生内存拷贝吗? 怎么答 字符串转成切片,会产生拷贝。严格来说,只要是发生类型强转都会发生内存拷贝。那么问题来了。 频繁的内存拷贝操作听起来对性能不大友好。有没有什么办法可以在字符串转成切片的时候不用发生拷贝呢? 代码实现 解释 StringHeader 是字符串在 go 的底层结构。 SliceHeader 是切...
https://golangguide.top/golang/%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E7%82%B9/golang%E9%9D%A2%E8%AF%95%E9%A2%98%EF%BC%9A%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%BD%AC%E6%88%90byte%E6%95%B0%E7%BB%84%EF%BC%8C%E4%BC%9A%E5%8F%91%E7%94%9F%E5%86%85%E5%AD%98%E6%8B%B7%E8%B4%9D%E5%90%97%EF%BC%9F.html
Beta Was this translation helpful? Give feedback.
All reactions