基础语法
常量
不同于变量在运行期分配存储内存(非优化状态),常量通常会被编译器在预处理阶段直接展开,作为指令数据使用。数字常量不会分配存储空间,无须像变量那样通过内存寻址来取值,因此无法获取地址。
指针
- 不能将内存地址与指针混为一谈。
- 存地址是内存中每个字节单元的唯一编号,而指针则是一个实体。指针会分配内存空间,相当于一个专门用来保存地址的整型变量。
Pointer
类似C
语言中的void*
万能指针,可用来转换指针类型。它能安全持有对象或对象成员,但uintptr
不行。后者仅是一种特殊整型,并不引用目标对象,无法阻止垃圾回收器回收对象内存。
并非所有对象都能进行取地址操作,但变量总是能正确返回(addressable)。指针运算符为左值时,我们可更新目标对象状态;而为右值时则是为了获取目标状态。
函数
- 第一类对象(
first-class object
)指可在运行期创建,可用作函数参数或返回值,可存入变量的实体。最常见的用法就是匿名函数。 - 函数只能判断其是否为nil,不支持其他比较操作。
- 从函数返回局部变量指针是安全的,编译器会通过逃逸分析(escape analysis)来决定是否在堆上分配内存。
- 不管是指针、引用类型,还是其他类型参数,都是值拷贝传递(pass-by-value)。区别无非是拷贝目标对象,还是拷贝指针而已。在函数调用前,会为形参和返回值分配内存空间,并将实参拷贝到形参内存。
变参:变参本质上就是一个切片。只能接收一到多个同类型参数,且必须放在列表尾部。
1、将切片作为变参时,须进行展开操作。如果是数组,先将其转换为切片。
2、既然变参是切片,那么参数复制的仅是切片自身,并不包括底层数组,也因此可修改原数据。如果需要,可用内置函数copy复制底层数据。
闭包
闭包是函数和引用环境的组合体。