程序结构
命名
如果一个名字是在函数内部定义,那么它的就只在函数内部有效。如果是在函数外部定义,那么将在当前包的所有文件中都可以访问。
名字的开头字母的大小写决定了名字在包外的可见性。大写外部可以访问,小写包内访问。包名一般小写。
声明
Go语言主要有四种类型的声明语句:var、const、type和func,分别对应变量、常量、类型和函数实体对象的声明。
每个源文件以包的声明语句开始,说明该源文件是属于哪个包。包声明语句之后是import语句导入依赖的其它包,然后是包一级的类型、变量、常量、函数的声明语句,包一级的各种类型的声明语句的顺序无关紧要。
变量
变量声明的一般语法如下:
var 变量名字 类型 = 表达式
其中“类型”或“= 表达式”两个部分可以省略其中的一个。如果省略的是类型信息,那么将根据初始化表达式来推导变量的类型信息。如果初始化表达式被省略,那么将用零值初始化该变量。
简短变量声明
在函数内部,有一种称为简短变量声明语句的形式可用于声明和初始化局部变量。它以“名字 := 表达式”形式声明变量,变量的类型根据表达式来自动推导
请记住“:=”是一个变量声明语句,而“=”是一个变量赋值操作。
简短变量声明语句对已经声明过的变量只有赋值行为。但简短变量声明语句中必须至少要声明一个新的变量。而且简短变量声明语句只有对已经在同级词法域声明过的变量才和赋值操作语句等价,如果变量是在外部词法域声明的,那么简短变量声明语句将会在当前词法域重新声明一个新的变量。
指针
一个指针的值是另一个变量的地址。一个指针对应变量在内存中的存储位置
new函数
- 表达式new(T)将创建一个T类型的匿名变量,初始化为T类型的零值,然后返回变量地址,返回的指针类型为*T
- 由于new只是一个预定义的函数,它并不是一个关键字,因此我们可以将new名字重新定义为别的类型。
- 例子:
func delta(old, new int) int { return new - old }
- 由于new被定义为int类型的变量名,因此在delta函数内部是无法使用内置的new函数的
变量的生命周期
变量的生命周期指的是在程序运行期间变量有效存在的时间间隔。
- 包一级声明的变量,生命周期和整个程序的运行周期是一致的
- 局部变量的声明周期则是动态的:从每次创建一个新变量的声明语句开始,直到该变量不再被引用为止,然后变量的存储空间可能被回收