博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go语言类型中的一些小细节【笔记】
阅读量:5912 次
发布时间:2019-06-19

本文共 1330 字,大约阅读时间需要 4 分钟。

把平时的一些笔记放上来,主要是一些比较小的问题,这里是关于golang中的类型中需要记录的小知识点。

常量

【1】可以是某些编译器能计算出结果的表达式

  1. unsafe.Sizeof
  2. len
  3. cap
const {    ptrSize = unsafe.Sizeof(unintptr(0))    strSize = len("Hello")}

【2】当常量的不指定类型和值,默认和上一行的常量的类型和值相同

const {    x uint6 = 120    y    s = "abc"    z}

枚举

关键字:iota

const {    a = iota    // 0 默认为0    b           // 1 默认递增1    c = 100     // 100 手动设置数据    d           // 100    e = iota    // 4    需要显式调用iota,计算c、d的位置    d           // 5}

展开

  1. 变量和常量的区别:变量在运行时分配内存空间,常量通常会被编译器在预处理阶段直接展开,作为指令数据直接使用。数字常量不分配地址空间;
  2. 常量陷阱:不指定类型的常量可以给其他常量赋值,显式指定值的常量不可以给其他常量赋值。

引用类型

特指:slice、map、chaneel

new和make的区别
  1. new按指定类型分配内存空间
  2. make按照一定的规则(创建函数或指令)构建目标,完成相关内存分配和属性初始化
自定义类型

定义:使用type创建用户的自定义类型,包括基于现有的基础类型、结构体、函数创建新的类型。

注意:即使type指定了新的类型,只能表明有相同的数据结构,两个类型间没有任何关系,不能视作别名

未命名类型

具有相同声明的未命名类型视作同一种类型

  1. 相同基类型的指针
  2. 相同元素类型和长度的数组(array)
  3. 相同元素类型的切片(slice)
  4. 相同键值类型的字典(map)
  5. 相同操作类型和方向的通道(channel)
  6. 相同字段序列的结构体,注意的是struct不相同也视作不同(struct)
  7. 相同签名【参数和返回值相同】的函数(func)
  8. 具有相同方法集【方法名和方法签名】的接口

未命名类型转化规则:

  1. 所属的类型相同
  2. 基础类型相同,其中一个是未命名类型
  3. 数据类型相同,将双向通道赋值给单向通道,且其中一个为未命名类型
  4. 将默认值nil赋值给切片、字典、通道、指针、函数、接口
  5. 对象实现了目标接口

指针类型

可以通过unsafe.Pointer转换成uintptr进行指针加减法运算,但可能造成非法访问。

【区别】

Pointer类似void 的万能指针,可用来转换指针类型,void 能安全持有对象成员,uintptr只是一种整数类型,不引用目标对象,无法阻止垃圾回收对象内存。

零长度对象地址

是否相等和版本实现有关,不等于nil,即使长度为0,对象依然合法存在,拥有合法的内存地址,和nil不一样。在runtime/malloc.go中有个zerobase的全局变量,通过mallocgc分配的0长度的对象都使用这个地址。在栈上分配,为调用mallocgc函数。

转载地址:http://tvmpx.baihongyu.com/

你可能感兴趣的文章
class类名的管理
查看>>
LeetCode:Rectangle Area
查看>>
文本查询
查看>>
查看帐号授权信息
查看>>
小程序(四):模板
查看>>
【转】Java - printf
查看>>
jquery获取元素到屏幕底的可视距离
查看>>
ENDNOTE使用方法(转发)
查看>>
计算机数制和运算的一点总结.
查看>>
UML系列 (五) 为什么要用UML建模之建模的重要性
查看>>
框架是什么,框架有什么用(转)
查看>>
集成测试
查看>>
[android] 手机卫士黑名单功能(列表展示)
查看>>
c3p0连接池配置
查看>>
对于I/O流中解压中遇到的问题
查看>>
问答项目---用户注册的那些事儿(JS验证)
查看>>
Android进阶篇-百度地图获取地理信息
查看>>
返回前一页并刷新页面方法
查看>>
2.3 InnoDB 体系架构
查看>>
linux系统配置之单一网卡配置多个不同网段IP(centos)
查看>>