这是我参与「第五届青训营 」笔记创作活动的第1天
主要围绕变量、常量作入门学习的总结
声明:定义实体对象的属性,包括type const func var,分别对应类型,常量,函数,变量的实体声明。
变量声明: 第一种方法 var 变量名 类型 = 表达式
var a int = 123
如果没有声明变量名的话 会自动识别
如果没有声明表达式 会赋予零值
第二种方法: 变量名 := 表达式
x := 1
当然我们也可以显示的指示变量类型,例如
x, y := int8(1), int64(2)
变量还能通过 变量块和变量列表声明
package main
import "fmt"
func main() {
var c int
var a, b int = 100, 200
x, y, z := 1, 2, 3//这是变量列表
var (
h, i, j = "a", "b", "c"
)//这是变量块
fmt.Println(a, b, c)
fmt.Println(x, y, z)
fmt.Println(h, i, j)
}
//错误多余的println写法:fmt.Println(a, b, c,'\n'),这个函数会自动换行滴
常量:
其声明方法类似变量,不过是将var替换成const,:=不变;变量块和变量列表适用
不同的地方在于常量必须赋值,示例如下
/*const c int 错误写法必须要赋值*/
const c int = 0 //正确写法
const a, b int = 100, 200
x, y, z := 1, 2, 3
const (
h, i, j = "a", "b", "c"
)
特殊的:iota
先说结论,iota可以理解为const的行索引,所以每多一行赋值就会+1
性质:\
- 不同 const 定义块的iota互不干扰;
- 所有注释行和空行全部忽略,即不计入行索引;
- 没有表达式的常量定义复用上一行的表达式;
例子:
const (
c = 10//iota = 0
d = iota//iota = 1
e//iota = 2
f = "hello"//iota = 3
g//iota = 4
h = iota//iota = 5
i//iota = 6
j = 0//iota = 7
k//iota = 8
l, m = iota, iota//iota = 9
n, o//iota = 10
p = iota + 1//iota = 11
q//iota = 12
_//iota = 13
r = iota * iota//iota = 14
s//iota = 15
t = r//iota = 16
u//iota = 17
v = 1 << iota//iota = 18
w//iota = 19
x = iota * 0.01//iota = 20
y float32 = iota * 0.01//iota = 21
z//iota = 22
)
上面的代码已经自动省去了注释行和空行,注意,这不影响常量的定义,是应该忽略的,并没有实际作用他们。
如何理解:正如我们前面所说,iota类似于行索引的作用,先记住iota初始值是0
然后每在新的一行赋值给常量的时候,如果右侧没有表达式,会复用上一行表达式
所以容易看到,案例里g会复用f的表达式,g的赋值结果为hello
同理案例里e会复用d的表达式,g的赋值结果为iota
那么关键的问题在于,iota到底怎么操作赋值?从哪里开始算作是0?\
从哪里开始算作是0:从你第一行的赋值开始 那一行对应的iota就是0
iota到底怎么操作赋值:
比如常量h = iota,那么首先去找它对应的行索引,很显然它的行索引是5,那么它就是5,关于前面说的“+1”,说的就是行索引随着赋值语句增加而增加的意思
所以以后无论碰到什么iota的妖魔鬼怪,都不用慌张,const声明块里头,若右侧没有"=表达式",那么先去找复用的位置;然后找到了表达式以后,如果是"=iota",把它对应的行索引找到,即可迎刃而解。