变量声明
变量声明的意义:go是静态语言。变量声明是告诉编译器该变量可以操作的内存边界信息,这主要是看变量的类型。
go的变量声明语句:
1 | var a int = 10 |
对比java
1 | int a = 10; |
go将变量名放在了变量类型的前面,为啥要这样设计?难道只是为了特立独行?
Go’s Declaration Syntax - go.dev
原生类型
零值
如果变量声明时没有显式为变量赋予初始值,Go 编译器会为变量赋予这个类型的零值
go的所有原生类型都有默认值
| 内置原生类型 | 默认值/零值 |
|---|---|
| 所有整型类型 | 0 |
| 浮点类型 | 0.0 |
| 布尔类型 | FALSE |
| 字符串类型 | “” |
| 指针、接口、函数、切片、channel、map | nil |
另外,像数组、结构体这样的复合类型变量的零值就是其组成元素的零值的复合
块声明和单行声明
go可以使用block块进行集中声明
1 | var { |
也可以在一行中进行多个声明
1 | var a, b, c int = 4, 5, 6 |
两者可以组合起来使用
1 | var { |
类型推断
go提供了自动类型推断的语法糖,使我们进行变量声明时可以省略类型
1 | var a = 10 |
自动推断的逻辑:根据右侧变量的值推断类型。整型值的默认类型就是int,浮点型的时float64,布尔值的是bool,字符值的是rune,字符串的是string
因为自动推断类型是根据值反推,所有声明语句必须赋值。var a这种声明是不合法的
因为有了类型推断,所以上面的单行语句
1 | var a, s, b = 10, "haha", true |
短变量声明
类型推断进一步简化,将var关键字省去
1 | a := 10 |
短变量声明也支持单行格式
1 | a, s, b := 10, "haha", true |
那么问题来了,为什么有两种变量申明方式?
绝不只是为了少敲两次键盘。一个很重要的原因是短变量声明可以很方便的进行重构。
变量作用域
go的变量从作用域上分为两种:包级变量和局部变量。比java简单多了。
如果这个包级变量的首字母大写,那么这个包级变量可以视为一个全局变量。
包级变量
在方法外声明的变量就是包级变量
包级变量只能用var声明,不能用短变量声明
包级变量可以只声明,不进行初始化,go语言也会让这些变量拥有零值。
1 | var a int32 |
代码规范建议
- 相同类型的变量声明放在同一个var代码块下
- 显示初始化和非显式初始化的变量声明分开
- 就近原则。进行在第一次使用这个变量的前面声明变量.当然了,如果一个包级变量在包内部被多处使 用,那么这个变量还是放在源文件头部声明比较适合的。
局部变量
局部变量仅声明而不初始化,只能用var形式。
声明同时进行初始化,建议采用短变量形式