内容简介:测试环境:系统 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的内存长度,这里输出的长度是描述符的长度。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
JSP 应用开发详解(第二版)
飞思科技产品研发中心 / 电子工业出版社 / 2004-1-1 / 55.00
本书结合JSP和Servlet的最新规范,从基本的语法和规范入手,以经验为后盾,以实用为目标,以实例为导向,以实践为指导,深入浅出地讲解了JSP 开发中的种种问题。以精简的内容介绍了JSP的语法、Servlet技术、JDBC技术、标签库技术、表达式语言、Struts、JavaServer Face等技术;对于JSP开发中常遇到的典型的难点,专门设置了专题进行集中讨论。本书的最后一篇围绕一个电子商务......一起来看看 《JSP 应用开发详解(第二版)》 这本书的介绍吧!