31

Go语言类型中的一些小细节【笔记】

 5 years ago
source link: https://studygolang.com/articles/16477?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

把平时的一些笔记放上来,主要是一些比较小的问题,这里是关于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函数。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK