2、程序结构
2.1 命名
命名规则:必须以一个字母(Unicode字母)或下划线开头,后面可以跟任意数量的字母、数字或下划线。区分大小写。
变量名开头字母的大小写决定了名字在包外的可见性。一个名字以大写字母开头则是导出的,即可以被包外访问。
推荐用驼峰命名。
2.2 声明
Go的四种类型的声明:var, const, type, func。
包一级声明语句的顺序无关紧要,函数内部的名字必须先声明之后才能使用。
2.3 变量
变量声明的语法
var 变量名 类型 = 表达式
其中, “类型” 或者 “= 表达式”可以省略其中的一个。
如果初始化表达式被省略,那么将用零值初始化该变量。 数值类型变量对应的零值是0,布尔类型变量对应的零值是false,字符串类型对应的零值是空字符串,接口或引用类型(包括slice、map、chan和函数)变量对应的零值是nil。数组或结构体等聚合类型对应的零值是每个元素或字段都是对应该类型的零值。
可以在一个声明语句中同时声明一组变量
var i, j, k int // int, int, int
var b, f, s = true ,2.3 ,"four" // bool, float64, string
函数内部可以使用简短变量声明语句
名字 := 表达式
如果有一些已经在相同的词法域声明过了,那么简短变量声明语句对这些已经声明过的变量就只有赋值行为了。
任何类型指针的零值都是nil。
Go中,返回函数中局部变量的地址也是安全的。
new(T)将创建一个T类型的匿名变量,做零值初始化之后,返回变量指针*T。
编译器会自动选择在栈上还是在堆上分配局部变量的存储空间,但这个选择并不是由用var还是new声明变量的方式决定的。
2.4 赋值
元组赋值:允许同时更新多个变量的值。在赋值之前,赋值语句右边的所有表达式将会先进行求值,然后再统一更新左边对应变量的值。
2.5 类型
类型声明语句创建一个新的类型名称,和现有类型具有相同的底层结构:
type 类型名字 底层类型
不同的数据类型,即使底层的结构相同,也不能相互比较或混在一个表达式中运算。
类型转换操作: T(x)
只有当两个类型的底层基础类型相同时,才允许这种转型操作,或者是两者都是指向相同底层结构的指针类型,这些转换只改变类型而不会影响值本身。
2.6 包和文件
可以用一个特殊的init初始化函数来初始化包。每个文件都可以包含多个init初始化函数:
func init() { /* ... */ }
在每个文件中的init初始化函数,在程序开始执行时按照它们声明的顺序被自动调用。
Go 的初始顺序是至关重要的, 在有多个文件的时候GO里面的INIT函数的执行顺序如下
转载于:https://my.oschina.net/zhuhui/blog/3079516