初遇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了。