1. 标识符和关键字

所有语言中都有自己的关键字和保留字,在定义函数、变量、方法的时候要规避这些关键字和保留字。

1.1. 标识符

在编程语言中标识符就是程序员定义的具有特殊意义的词,比如变量名、常量名、函数名等等。 Go语言中标识符要求如下:

  • 标识符由字母数字和 _ (下划线)组成,并且只能以字母或 _ 开头。 _ 表示丢弃该变量(不分配内存)
  • 严格区分大小写,首字母大写的标识符可以被其它包访问,即对外可见
  • Go中通常使用驼峰式命名,而不是下划线连接,如 ApiServerapiServer
  • 不能与关键字、保留字冲突,避免和已有的包名冲突

    1.2. Go中保留字和关键字

    1. # 25个关键字
    2. break default func interface select
    3. case defer go map struct
    4. chan else goto package switch
    5. const fallthrough if range type
    6. continue for import return var
  1. # 37个保留字
  2. Constants:
  3. true false iota nil
  4. Types:
  5. int int8 int16 int32 int64
  6. uint uint8 uint16 uint32 uint64 uintptr
  7. float32 float64
  8. complex128 complex64
  9. bool string error
  10. byte rune
  11. Functions:
  12. make len cap new append copy close delete
  13. complex real imag
  14. panic recover

2. 变量

2.1. 变量的定义方式

Python和Bash shell中变量赋值的过程自动完成变量定义。go中的变量需要声明其类型(如字符串、浮点数等),也可以由编译器自动完成数据类型的识别。Go语言中,变量的命名建议采用小驼峰方式命名,如: userName , studentKey

  1. 1. 变量声明的类型
  2. (1) 标准声明
  3. var name type // var为关键字定义当前在定义变量
  4. (2) 批量声明
  5. var (
  6. name1 type1
  7. name2 type2
  8. ...
  9. )
  10. 2. 变量的初始化
  11. Go语言在声明简单数据类型变量的时候,会自动对变量的内存区域进行初始化操作,每个类型的变量在赋值之前都有默认值(零值):
  12. int --> 0 ; bool --> 0 ; string --> "" ; 指针类型 --> nil
  13. 3. 变量的定义
  14. (1) 先声明后赋值,声明过程中会有一个默认值,然后赋值给变量替换默认值(赋值过程不能在全局作用域)
  15. var varName string
  16. varName = value
  17. (2) 直接指定类型和默认值,可以在全局作用域
  18. var varName string = value
  19. (3) 类型推导,即直接赋值,由编译器根据值自动判断数据类型,然后自动完成声明
  20. var varName = value
  21. (4) 短变量声明(仅在函数内部使用)
  22. func funcName() {
  23. varName := value // 声明并完成赋值
  24. }
  25. (5) 匿名变量(不占内存空间,也不会分配内存)
  26. func main() {
  27. x, _ := foo() // foo函数返回值为2个,但是第二值用不到,可以将其丢弃
  28. }
  29. 4. 注意事项
  30. (1) 变量命令方式建议采用小驼峰式命名
  31. (2) 同一个作用域内不能重复声明变量
  32. (3) 全局作用域内,不能直接使用 varName := value 方式给变量赋值
  33. (4) 局部赋值后,必须调用,否则编译出错
  34. (5) := 不能用在func之外
  35. (6) _ 表示丢弃某个值,起到占位的作用

2.2. 案例

  1. package main
  2. import "fmt"
  3. var (
  4. name string
  5. age int
  6. )
  7. func main() {
  8. name = "zhangsan"
  9. fmt.Println(name)
  10. fmt.Println(age)
  11. var isStudent bool
  12. fmt.Println(isStudent)
  13. }
  1. e:\OneDrive\Projects\Go\src\gitee.com\studygo\day01\01-variables>go run main.go
  2. zhangsan
  3. 0
  4. false

3. 常量

3.1. 常量的定义

  1. Python不同,Go中存在常量(constant),这类变量在定义的时候必须赋值,且一旦定义,代码运行期间就不能修改
  2. 1. 常量的定义方式
  3. const name = value
  4. const (
  5. name1 = value1
  6. name2 = value2
  7. )
  8. 2. 常量的默认值
  9. 常量必须赋值,如果常量没赋值,则继承上一行定义的常量值

3.1.1. 案例一

  1. package main
  2. import "fmt"
  3. const meta = "10.4.7.111"
  4. const (
  5. aaa = 100
  6. bbb
  7. ccc = "xxx"
  8. ddd
  9. )
  10. func main() {
  11. fmt.Println(meta)
  12. fmt.Println(aaa,bbb,ccc,ddd)
  13. }
  1. e:\OneDrive\Projects\Go\src\gitee.com\studygo\day01\01-variables>go run main.go
  2. 10.4.7.111
  3. 100 100 xxx xxx

3.1.2. 案例二

  1. package main
  2. import "fmt"
  3. const (
  4. dbHost string = "app01.mysql.prod.com"
  5. dbUser string = "app01"
  6. dbPassword string = "App01.owksok199241@333"
  7. )
  8. func main() {
  9. fmt.Printf("MySQL connections info:\n host:%s user:%s password:%s\n", dbHost,dbUser,dbPassword)
  10. }
  1. [root@heyingsheng 2020-03-12]# go run 02.go
  2. MySQL connections info:
  3. 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

  1. package main
  2. import "fmt"
  3. const v1 = 1
  4. const v2 = iota // 当前是一个新的const语句块,因此iota从0开始,v2是当前const第一个变量,因此v2为0
  5. const v3 = iota // 当前是一个新的const语句块,因此iota从0开始,v3是当前const第一个变量,因此v3为0
  6. const (
  7. x1 = 100
  8. x2
  9. x3 = "s1"
  10. x4
  11. x5 = iota // x5在当前const语句块中索引为4,因此x5=4
  12. )
  13. func main() {
  14. fmt.Println(v1, v2, v3) // 1 0 0
  15. fmt.Println(x1,x2,x3,x4,x5) // 100 100 s1 s1 4
  16. }

3.2.2. iota案例2

  1. package main
  2. import "fmt"
  3. const (
  4. _ = iota
  5. KB = 1 << (10 * iota) // 位移运算,这是iota的一种使用场景
  6. MB = 1 << (10 * iota)
  7. GB = 1 << (10 * iota)
  8. TB = 1 << (10 * iota)
  9. PB = 1 << (10 * iota)
  10. )
  11. const (
  12. Debug = iota // 日志级别定义
  13. Info
  14. Warning
  15. Error
  16. Fatal
  17. )