变量和常量
变量
变量只能一字母,数字或者下划线_
开头。函数外面声明的变量属于全局变量,整个包不能重名。同一函数内的变量同理,不能重名。
声明变量
声明变量有一下几种格式:
声明变量默认值为对应类型的空值,
int=0
,string=""
,bool=false
等~
- 声明单个变量:
var 变量名 变量类型
- 批量声明变量
var( 变量名b 类型 变量名a 类型 变量名1,变量名2,变量名3 数据类型 )
变量初始化:
单个变量初始化
初始化变量格式:
var 变量名 类型 = 表达式
比如下面三种方法都可以在声明变量的同时初始化变量:var name string = "abd" + "bbb" var name int = 9 var a,b,c int = 8,3,6
批量声明同时初始化
批量声明并初始化变量,或者直接给变量赋值就算是初始化变量了。var ( name string = "tiedan" nianling int = 90 b,c,d string = "aa","bb","cc" )
变量类型推导
声明变量时可以省略类型
,编译器会自动帮我们推导变量类型。比如:var ggg = "abd"
编译器会自动识别变量ggg
的类型为string
,默认类型为string64
。当然为了节省内存你可以指定变量内存。
声明并初始化变量的简化写法
在函数内部你也可以使用aa,bb := "aaa","bbbb"
来声明并初速化变量。有一点要注意:=
前面必须至少有一个新的没有声明过的新变量。比如jj
和zz
是全局变量已经声明过了,jj,zz := 3,8
就会报错,但是改为kk,jj,zz := 8,9,3
就没问题,虽然jj
和zz
是全局变量已经声明过,但是kk
是一个全新变量,编译器会放行通过。
匿名变量
_
是一个匿名变量。例如某个函数name()
会返回三个数据,但是前两个对我们来说没有任何用处,此时就用到匿名变量了_,_,a = name()
,变量a取得函数name()
返回的第三个数据,前两个数据被我们忽视了,匿名变量_
不占用命名空间,不会被分配内存地址,随用随抛,节省空间和程序运行效率。
常量
常量一旦被定义,就不能在被修改。常量声明和变量声明基本类似,只是把关键字var
换成常量关键字const
。另外需要注意的一点是,批量声明常量时,某个没有被赋值的常量的默认值将会是上面一行常量的值。
const (
aa = 10//aa=10
bb = 20//bb=20
cc //cc=20('cc'空值,所以和上一行'bb'的值相同。
dd = 40//dd=40
ee //('ee'空值,跟上一行'dd'的值相同。
)
另外:如果空值常量的上一行是aa,bb = 10,20
这种方式声明的常量,编译器会报错,你根本就不会成功编译滴。
const (
aa, bb = 10, 20//因为下面常量'cc'是空值,这一行又是简写的常量声明格式,编译器会报错,根本不可能通过编译。
cc //这里的常量'cc'是空值。
dd = 45
)
常量计数器iota
iota
在碰到常量关键字const
时清零。const ( aa = iota//aa=0 bb = iota//bb=1 ) const ( //这里是关键字'const',所以下面第一行'cc'是'0'。 cc = iota//cc=0 dd = iota//dd=1 )
- iota碰到空值常量
如果常量是空值,就会跟上一行的值相同,所以空值的cc
和dd
的值是100
,但是ee
还是iota
,他说按行计数,所以ee
是4
。const ( aa = iota//0 bb = 100 //100 cc //100--'cc'是空值,所以和上一行'bb'的值相同。 dd //100--'dd'空值,所以和'cc'的值相同,这里的'cc'已经拿到他上面一行的'dd'的值'100'了,所以'dd'也是'100' ee = iota//4--你们'aa','bb','cc','dd'随便怎么折腾,反正只要我'=iota',那我就按行算。所以我是'4'。 )
- iota一行计一次数
一点要记住iota
按行算(有效声明常量的行,不管空值还是赋值),不是按常量个数算。所以aa
和bb
并列第一行,都是0
,cc
有自己的值100
,dd
是iota
按行算所以是1
,ee
是2
。const ( aa, bb = iota, iota//aa=0 bb=0 cc, dd = 100, iota//'cc'有自己的值'100','dd'是'iota'按行计数所以是'1'。 ee = iota//'ee'是'2'。 )
- iota可以做算术运算
iota
可以做加减乘除等运算,做完运算就相当于有了属于自己的特定的专属的值,但是没有做运算的iota
还是按自己的行计数,互不影响。所以aa
和bb
并列第一行,aa
没有做任何运算所以按行计数是0
,bb
的iota
本来是0
,做了一个加法运算,那bb
就是3
了。cc
有自己的值100
,dd
的iota
按行计数是1
做个减法变-1
。ee
说:“一帮沙雕,你们继续折腾,我还是按照我的行算数。0..1..我是2
。”const ( aa, bb = iota, iota + 3//'aa=0','bb=3' cc, dd = 100, iota - 2//'cc=100','dd=-1' ee = iota//'ee=2' )