初遇unsafe.Sizeof()时,以为Go语言中的sizeof和C语言的sizeof不太一样,对于算出的值也是一脸懵逼。深入了解才发现两者并没有区别,是自己误解了。
package main
import (
"fmt"
"unsafe"
)
func main(){
var test string = "abc"
a := len(test)
b := unsafe.Sizeof(test)
fmt.Println(a,b)
}
最终的运算结果是:3,16
对于接触过python的同学来说,3很容易理解,但是16从何而来呢?
原来是因为unsafe.Sizeof返回的是数据类型的大小,而string在Go中并不是直存类型,它是一个结构体类型:
type StringHeader struct {
Data uintptr
Len int
}
在64位系统上uintptr和int都是8字节,加起来就16了。
本文深入探讨了Go语言中unsafe.Sizeof()函数的工作原理,解释了其与C语言中sizeof的区别,以及如何正确理解返回的数据类型大小。通过一个具体的例子,详细分析了string类型在Go中的内存布局。
2963

被折叠的 条评论
为什么被折叠?



