[ Go基础语法| 青训营笔记Day1]

190 阅读2分钟

image.png

这是我参与「第五届青训营 」笔记创作活动的第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
性质:\

  1. 不同 const 定义块的iota互不干扰;
  2. 所有注释行和空行全部忽略,即不计入行索引;
  3. 没有表达式的常量定义复用上一行的表达式;

例子:

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",把它对应的行索引找到,即可迎刃而解。

借鉴的文章:彻底搞懂iota