二、内容
2.1)、变量定义
s := ""
var s string
var s = ""
var s string = ""
第一种形式,只能用在一个函数内部,尔package级别的便利,禁止用这样的声明方式;
第二种形式的以来于string类型的内部初始化机制,被初始化为空字符串;
第三种形式使用得很少,除非同时声明多个变量;
第四种形式会显示的表面变量的类型,在多变量同时声明时可以用到;
var声明语句可以创建一个特定类型的变量,然后给变量附加一个名字并且设置变量的初始值。
var 变量名字 类型 = 表达式
如果表达式被省略,那么将用零值初始化该变量。数值类型变量对应的零值是0,布尔类型变量对应的零值是fasle,字符串类型对应的零值是空字符串,接口或引用类型(包括slice、map、chan和函数)变量对应的零值是nil。数组或结构体等聚合类型对应的零值是每个元素或字段都是对应该类型的零值。
var i, j, k int
var b ,f ,s = true, 2.3, "four"
简短变量的声明方式如下:
a := 0.0
因为简洁和灵活的特点,简短变量声明被广泛用于大部分的局部变量的声明和初始化。
var形式的声明语句往往是用于需要显式指定变量类型的地方或者因为变量稍后会被重新赋值而初始化
简短变量声明语句中必须至少要声明一个新的变量
a,b := 1,2
a,b := 3,4 //编译不通过
a,c := 5,6 //编译通过
c := 7 //编译不通过
2.2)、变量命名
命名规则:一个名字必须意一个字母(Unicode字母)或下花絮开头,后面可以跟任意数量的字母、数字或下划线。大小写字母是不同的。
go中有25个关键字;关键字不能用于自定义名字,只能在特定语法结构中使用
另外还有30个预定义的名字,主要对应内建的常量、类型和函数
这些内部预先定义的名字并不是关键字,你可以再定义中重新使用它们。在一些特殊的常见中重新定义它们也是有意义的,但是也要注意避免过度而引起语义混乱
变量名的大小写会影响其使用范围
如果一个名字是大写字母开头的(前提是定义的包级别的变量),那么它将是导出的,即使是可以被外部的包访问的。
2.3)、声明
go中有四种声明语句:var 、const、type、func,分别对应变量、常量、类型和函数实体对象的声明。
一个函数的声明由一个函数的名字、参数列表、一个可选的返回值列表和包含函数定义的函数体组成。如果函数没有返回值,那么返回值列表是省略的。
2.4)、指针
一个指针的值是另外一个变量的地址。一个指针对应变量在内存中的存储位置。并不是每一个值都会有一个内存地址,但对于每一个变量必然有对应的内存地址。通过指针我们可以直接读或者更新对应变量的值,而不需要知道该变量的名字。
x := 1
p = &x //地址
fmt.Println(*p) //打印指针指向的值
*p = 2
fmt.Println(*p)
2.5)、包的初始化
每个文件都可以包含多个init初始化函数,在程序开始执行的时候按照它们声明的顺序被自动调用。
每个包在解决依赖的前提下,以导入声明的顺序初始化,每个包只会初始化一次。因此,如果一个p包导入了q包,那么在p包初始化的时候可以认为q包必然已经初始化了。初始化工作自下而上进行的。main包最后被初始化,以这种方式,可以确保在main函数执行之前,所有
2.6)、作用域
声明语句的作用域对应的是一个源代码的文本区域;它是一个编译时的属性。
一个变量的生命周期是指程序运行时变量存在的有效时间段,在此时间区域内它可以被程序的其他部分引用,是一个运行时概念