Golang中的unsafe.Sizeof()简述

栏目: Go · 发布时间: 7年前

内容简介:测试环境:系统 win7 64位go version: go1.10 windows/amd64

测试环境:

系统 win7 64位

go version: go1.10 windows/amd64

我们先看一下代码的输出

package main

import "unsafe"

func main() {
	// string
	str1 := "abc"
	println("string1:", unsafe.Sizeof(str1)) // 16
	str2 := "abcdef"
	println("string2:", unsafe.Sizeof(str2)) // 16
	
	// 数组
	arr1 := [...]int{1, 2, 3, 4}
	println("array1:", unsafe.Sizeof(arr1)) // 32 = 8 * 4

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

	// slice
	slice1 := []int{1, 2, 3, 4}
	println("slice1:", unsafe.Sizeof(slice1)) // 24

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

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

1、字符串类型

为什么字符串的大小一直是16的,为什么呢?

实际上字符串类型对应一个结构体,该结构体有两个域,第一个域是指向该字符串的指针,第二个域是字符串的长度,每个域占8个字节,但是并不包含指针指向的字符串的内容,这也就是为什么sizeof始终返回的是16。

组成可以理解成此结构体

typedef struct {
    char* buffer;
    size_tlen;
} string;

2、数组类型

编译的时候系统自动,int的长度是由系统平台来决定的,我用的是64位的系统,所以一个int就是 int64,每个数字占用8个字节,成员数组元素个数正好等于输出的值。

3、切片类型

看到切片和数组还是有些不一样的,我们看一下官方包的解释 /src/unsafe/unsafe.go

// 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.

意思是说如果是slice的话,则返回的是slice描述符的长度,而不是slice的内存长度,这里输出的长度是描述符的长度。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

马云:未来已来

马云:未来已来

阿里巴巴集团 / 红旗出版社 / 2017-4-1 / CNY 49.00

阿里巴巴集团:全球主要的互联网公司之一,由马云带领其他17个创始人,于1999年在中国杭州创立。阿里巴巴集团经营多元化的互联网业务,以“让天下没有难做的生意”为使命,致力于为创业者和消费者提供全球化的商业平台,打造开放、协同、繁荣的电子商务生态系统。自成立以来,阿里巴巴集团建立了领先的消费者电子商务、网上支付、B2B网上交易市场及云计算业务,并积极开拓无线应用、手机操作系统和互联网电视等领域。一起来看看 《马云:未来已来》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

URL 编码/解码
URL 编码/解码

URL 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具