计算机 1byte=8bit
utf8 格式 1个英文字符是1byte,1个数字是1byte(0-9)
这个是相对于字符编码来说的
而代码里的数据类型不同
go数据类型:
int=int64 =用64位bit表示一个int也就是8个字节byte,int的取值范围为-2的31次方到2的31次方(-21 4748 3648 ~ 21 4748 3647 )
rune的底层是uint32,所以rune占4个字节,用4个字节表示一个字符,所以它可以表示的字符更多,比如中文。
byte底层是uint8,所以byte占1个字节,byte代表的是ascii码里的字符
https://www.cnblogs.com/wongbingming/p/12778777.html
string的是有多个byte切片组成的
//type stringStruct struct {
// str unsafe.Pointer
// len int
//}
https://www.cnblogs.com/lovezbs/p/13127478.html
切片的底层是slice的底层一个struct,具有cap, length, ptr三个属性
//type slice struct {
// array unsafe.Pointer
// len int
// cap int
//}
https://cloud.tencent.com/developer/article/1683655
结构体存在内存对齐
unsafe.Sizeof 是变量的类型的所占用的内存,而不是变量本身的内存
比如变量 a 是string类型,string类型是 一个stringStruct结构体 占16字节,而string变量本身
百度搜索 golang unsafe.Sizeof查看更多信息
切片是一种引用类型,一个切片是由指针 ,长度,容量表示,引用的是数组索引指针指向 数组的一个地址,而len只是这个切片的长度,所以切片变量本身的内存大小就是sizeof的值。只是在内存中还有个数组
字符串本身是多个byte组成的,本身也是一种引用,stringStruct由一个指针地址和长度组成,string声明好了就是一个固定的数值,不能修改,如果要修改 要转换成[]byte修改
https://www.cnblogs.com/sunsky303/p/11661585.html
:
总结
- Go 不能进行指针运算 (明显降低复杂度和出错风险)
- 指针传递是很廉价的,只占用 4 个或 8 个字节。当程序在工作中需要占用大量的内存,或很多变量,或者两者都有,使用指针会减少内存占用和提高效率。
- 指针也是一种类型,不同于一般类型,指针的值是地址,这个地址指向其他的内存,通过指针可以读取其所指向的地址所存储的值。
- 函数方法的接受者,也可以是指针变量。
- 只声明未赋值的变量,默认会初始化为零值,int类是0,float类是0,bool是false, string是空串,复数类型如complex64、complex128,默认值为0+0i,[4]int是{0,0,0,0},引用类型和指针的零值都为nil,比如error默认是nil, nil类型还没有指向内存空间,不能直接赋值,因此需要通过new开辟一个内存地址,或指向一个已存在的变量地址。
- [N]int是数组,而[]int才是slice,即固定长度是数组,数组被分配在stack里,slice如果>32 kB就分配在heap里,同时stack速度比heap快,heap空间比stack大。
- 七个小矮人(slice,map,func,channel,pointer, string, interface),自带魔法绳(指针), 所以没必要将它定义成引用类型。
- struct、string实例,内存占用大则使用引用,小则无需引用
- 纯量(int类, float类, bool)无需使用引用
- 变量的生命周期越长则使用指针,否则使用值类型,防止stack区满了
- 不想被修改,或者需要并发安全,可以使用值拷贝
- 其他情况,优先用引用
资料
https://blog.csdn.net/qq_24599471/article/details/106000190