文章目录
1.程序结构
1.命名
关键字和内建字
2.声明
- var:变量的声明
- const:常量的声明
- type:类型的声明
- func:函数实体对象的声明
3.变量
变量声明(以字符串为例)
var a string = "123"
a := "123"
var a string
a = "123"
变量默认值
- 数值类型变量对应的零值是0
- 布尔类型变量对应的零值是false
- 字符串类型对应的零值是空字符串
- 接口或引用类型(包括slice、map、chan和函数)变量对应的零值是nil
- 数组或结构体等聚合类型对应的零值是每个元素或字段都是对应该类型的零值。
注意点
“:=”是一个变量声明语句,而“=‘是一个变量赋值操作
指针
一个变量对应一个保存了变量对应类型值的内存空间。一个指针的值是另一个变量的地址。一个指针对应变量在内存中的存储位置。
任何类型的指针的零值都是nil。如果 p != nil 测试为真,那么p是指向某个有效变量。指针之间也是可以进行相等测试的,只有当它们指向同一个变量或全部是nil时才相等。
指针包含了一个变量的地址,因此如果将指针作为参数调用函数,那将可以在函数中通过该指针来更新变量的值。
写法:
p := &x // p是指向x的指针
*p = 2 // *p代表x,这个表达式等价于x = 2
new函数
表达式new(T)将创建一个T类型的匿名变量,初始化为T类型的零值,然后返回变量地址,返回的指针类型为 *T 。
每次调用new函数都是返回一个新的变量的地址。
变量的回收思路
从每个包级的变量和每个当前运行函数的每一个局部变量开始,通过指针或引用的访问路径遍历,是否可以找到该变量。如果不存在这样的访问路径,那么说明该变量是不可达的,也就是说它是否存在并不会影响程序后续的计算结果。
因为一个变量的有效周期只取决于是否可达,因此一个循环迭代内部的局部变量的生命周期可能超出其局部作用域。同时,局部变量可能在函数返回之后依然存在。
关于go的垃圾回收和堆上分配、栈上分配的说法,可参考下面: