1. 标识符和关键字
所有语言中都有自己的关键字和保留字,在定义函数、变量、方法的时候要规避这些关键字和保留字。
1.1. 标识符
在编程语言中标识符就是程序员定义的具有特殊意义的词,比如变量名、常量名、函数名等等。 Go语言中标识符要求如下:
- 标识符由字母数字和
_(下划线)组成,并且只能以字母或_开头。_表示丢弃该变量(不分配内存) - 严格区分大小写,首字母大写的标识符可以被其它包访问,即对外可见
- Go中通常使用驼峰式命名,而不是下划线连接,如
ApiServer或apiServer - 不能与关键字、保留字冲突,避免和已有的包名冲突
1.2. Go中保留字和关键字
# 25个关键字break default func interface selectcase defer go map structchan else goto package switchconst fallthrough if range typecontinue for import return var
# 37个保留字Constants:true false iota nilTypes:int int8 int16 int32 int64uint uint8 uint16 uint32 uint64 uintptrfloat32 float64complex128 complex64bool string errorbyte runeFunctions:make len cap new append copy close deletecomplex real imagpanic recover
2. 变量
2.1. 变量的定义方式
Python和Bash shell中变量赋值的过程自动完成变量定义。go中的变量需要声明其类型(如字符串、浮点数等),也可以由编译器自动完成数据类型的识别。Go语言中,变量的命名建议采用小驼峰方式命名,如: userName , studentKey
1. 变量声明的类型(1) 标准声明var name type // var为关键字定义当前在定义变量(2) 批量声明var (name1 type1name2 type2...)2. 变量的初始化Go语言在声明简单数据类型变量的时候,会自动对变量的内存区域进行初始化操作,每个类型的变量在赋值之前都有默认值(零值):int --> 0 ; bool --> 0 ; string --> "" ; 指针类型 --> nil3. 变量的定义(1) 先声明后赋值,声明过程中会有一个默认值,然后赋值给变量替换默认值(赋值过程不能在全局作用域)var varName stringvarName = value(2) 直接指定类型和默认值,可以在全局作用域var varName string = value(3) 类型推导,即直接赋值,由编译器根据值自动判断数据类型,然后自动完成声明var varName = value(4) 短变量声明(仅在函数内部使用)func funcName() {varName := value // 声明并完成赋值}(5) 匿名变量(不占内存空间,也不会分配内存)func main() {x, _ := foo() // foo函数返回值为2个,但是第二值用不到,可以将其丢弃}4. 注意事项(1) 变量命令方式建议采用小驼峰式命名(2) 同一个作用域内不能重复声明变量(3) 全局作用域内,不能直接使用 varName := value 方式给变量赋值(4) 局部赋值后,必须调用,否则编译出错(5) := 不能用在func之外(6) _ 表示丢弃某个值,起到占位的作用
2.2. 案例
package mainimport "fmt"var (name stringage int)func main() {name = "zhangsan"fmt.Println(name)fmt.Println(age)var isStudent boolfmt.Println(isStudent)}
e:\OneDrive\Projects\Go\src\gitee.com\studygo\day01\01-variables>go run main.gozhangsan0false
3. 常量
3.1. 常量的定义
与Python不同,Go中存在常量(constant),这类变量在定义的时候必须赋值,且一旦定义,代码运行期间就不能修改1. 常量的定义方式const name = valueconst (name1 = value1name2 = value2)2. 常量的默认值常量必须赋值,如果常量没赋值,则继承上一行定义的常量值
3.1.1. 案例一
package mainimport "fmt"const meta = "10.4.7.111"const (aaa = 100bbbccc = "xxx"ddd)func main() {fmt.Println(meta)fmt.Println(aaa,bbb,ccc,ddd)}
e:\OneDrive\Projects\Go\src\gitee.com\studygo\day01\01-variables>go run main.go10.4.7.111100 100 xxx xxx
3.1.2. 案例二
package mainimport "fmt"const (dbHost string = "app01.mysql.prod.com"dbUser string = "app01"dbPassword string = "App01.owksok199241@333")func main() {fmt.Printf("MySQL connections info:\n host:%s user:%s password:%s\n", dbHost,dbUser,dbPassword)}
[root@heyingsheng 2020-03-12]# go run 02.goMySQL connections info:host:app01.mysql.prod.com user:app01 password:App01.owksok199241@333
3.2. iota
iota是go语言的常量计数器,只能在常量的表达式中使用。
iota是当前const语句块中的变量位置索引,每次出现新的const,iota的值就0重新计数
3.2.1. iota 案例1
package mainimport "fmt"const v1 = 1const v2 = iota // 当前是一个新的const语句块,因此iota从0开始,v2是当前const第一个变量,因此v2为0const v3 = iota // 当前是一个新的const语句块,因此iota从0开始,v3是当前const第一个变量,因此v3为0const (x1 = 100x2x3 = "s1"x4x5 = iota // x5在当前const语句块中索引为4,因此x5=4)func main() {fmt.Println(v1, v2, v3) // 1 0 0fmt.Println(x1,x2,x3,x4,x5) // 100 100 s1 s1 4}
3.2.2. iota案例2
package mainimport "fmt"const (_ = iotaKB = 1 << (10 * iota) // 位移运算,这是iota的一种使用场景MB = 1 << (10 * iota)GB = 1 << (10 * iota)TB = 1 << (10 * iota)PB = 1 << (10 * iota))const (Debug = iota // 日志级别定义InfoWarningErrorFatal)
