登录
首页 >  Golang >  Go问答

Golang 字符串复制内存地址的内存分配

来源:stackoverflow

时间:2024-02-16 23:27:24 457浏览 收藏

目前golang学习网上已经有很多关于Golang的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《Golang 字符串复制内存地址的内存分配》,也希望能帮助到大家,如果阅读完后真的对你学习Golang有帮助,欢迎动动手指,评论留言并分享~

问题内容

我目前正在阅读《go 编程语言》一书,其中描述了字符串或子字符串的副本具有相似的内存地址。

s := "hello"
c := s

fmt.println(&s, &c) // prints 0xc000010230 0xc000010240

我的问题是,&c 不应该与 &s 相同吗,因为 c 是精确的副本?

RAM
      Address    |     Value
 &s 0xc000010230 |    "hello" <----- s
 &c 0xc000010240 |    "hello" <----- c

正确答案


cs 实际上是两个不同字符串标头。但两者都指向同一个“hello”

sh := (*reflect.stringheader)(unsafe.pointer(&s))
ch := (*reflect.stringheader)(unsafe.pointer(&c))
fmt.println(sh.data, ch.data)

https://go.dev/play/p/Ckl0P3g4nVo

字符串头的data字段指向字符串中的第一个byte,字符串头的len字段指示字符串的长度。您可以使用该信息来确认字符串标头指向原始字符串。

sh := (*reflect.StringHeader)(unsafe.Pointer(&s))
for i := 0; i < sh.Len; i++ {
    sp := (*byte)(unsafe.Pointer(sh.Data + uintptr(i)))
    fmt.Printf("%p = %c\n", sp, *sp)
}

https://go.dev/play/p/LFfdxxARw1f

本篇关于《Golang 字符串复制内存地址的内存分配》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>