unsafe.sizeof()

描述

// Sizeof takes an expression x of any type and returns the size in bytes
// of a hypothetical variable v as if v was declared via var v = x.
// The size does not include any memory possibly referenced by x.
// For instance, if x is a slice,  Sizeof returns the size of the slice
// descriptor, not the size of the memory referenced by the slice.
func Sizeof(x ArbitraryType) uintptr

翻译:
//size of接受任何类型的表达式x并返回一个假设变量v的字节大小,就好像v是通过var v=x声明的。
//该大小不包括X可能引用的任何内存
//例如,如果x是一个切片,size of返回切片描述符的大小,而不是切片引用的内存大小

测试

package main

import (
	"fmt"
	"unsafe"
)

type iface interface {
	D()
}

type Man struct {
	Name string
	Age int  //大小和机器位数有关
}

type Woman struct {
}


func main() {
	// 字符串
	str1 := "abc"
	fmt.Println("string1:", unsafe.Sizeof(str1)) // 16
	str2 := "abcdef"
	fmt.Println("string2:", unsafe.Sizeof(str2)) // 16

	// 数组
	arr1 := [...]int{1, 2, 3, 4}
	fmt.Println("array1:", unsafe.Sizeof(arr1)) // 32 = 8 * 4

	arr2 := [...]int{1, 2, 3, 4, 5}
	fmt.Println("array2:", unsafe.Sizeof(arr2)) // 40 = 8 * 5

	// 切片
	slice1 := []int{1, 2, 3, 4}
	fmt.Println("slice1:", unsafe.Sizeof(slice1)) // 24

	slice2 := []int{1, 2, 3, 4, 5}
	fmt.Println("slice2:", unsafe.Sizeof(slice2)) // 24

	slice3 := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
	fmt.Println("slice3:", unsafe.Sizeof(slice3)) // 24

	// 接口、空接口
	var interface1 interface{}
	fmt.Println("interface1:", unsafe.Sizeof(interface1)) //16

	var interface2 iface
	fmt.Println("interface2:", unsafe.Sizeof(interface2)) //16

	// 结构体、空结构体
	st1 := Man{}
	fmt.Println("struct1:", unsafe.Sizeof(st1)) //32
	fmt.Println("struct1.Name:", unsafe.Sizeof(st1.Name)) //16
	fmt.Println("struct1.Age:", unsafe.Sizeof(st1.Age)) //8

	st2 := Woman{}
	fmt.Println("struct2:", unsafe.Sizeof(st2)) //0
   
    //映射
	m1 := map[string]int{
		"h":1,
		"e":2,
		"l":3,
		"o":4,
	}
	fmt.Println("map1:", unsafe.Sizeof(m1)) //8

	m2 := map[string]int{}
	fmt.Println("map2:", unsafe.Sizeof(m2)) //8
  
   # 指针
   var i = 8
   var ip = &i
   var s = "sss"
   var sp = &s
   var f = 9.99
   var fp = &f
   fmt.Println("pointer1:", unsafe.Sizeof(ip)) //8
   fmt.Println("pointer2:", unsafe.Sizeof(sp)) //8
   fmt.Println("pointer3:", unsafe.Sizeof(fp)) //8
}

分析

  • 为什么字符串类型的 unsafe.Sizeof() 一直是16呢?
    实际上字符串类型对应一个结构体,该结构体有两个域,第一个域是指向该字符串的指针,第二个域是字符串的长度,每个域占8个字节,但是并不包含指针指向的字符串的内容,这也就是为什么sizeof始终返回的是16。
  • 编译的时候系统自动分配内存,int的长度是由系统平台来决定的,我用的是64位的系统,所以一个int 代表的就是 int64 数据类型,每个数字占用8个字节。byte(1字节),uint8(1字节),uint16(2字节),uint32(4字节),uint64(占用8字节), byte是uint8的别名,这些全是无符号型的,对应的还有有符号型的,区别也就是一个值范围不同而已。
  • 不同数据类型,其底层结构不一样
  • 具体查看golang底层数据类型实现原理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值