03 变量与常量
03 变量与常量
有了其他语言的基础,变量的定义应该还是比较熟悉的,然后 go 与 cpp 一样,都是强类型语言,常见的基本类型大都一致:布尔,数值类型(比cpp多了复数),字符串等,除此以外还有一些 go 独有的复合类型,不过本节我们的中心不在介绍各个类型,变量类型这一块有个印象即可。
变量
Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字,关键字和保留字都不能用作变量名,主要采用驼峰风格命名,与其他语言不同的是,Go 的变量 声明后必须使用。
如果需要导出给其他包就用大驼峰,只在当前包使用就用小驼峰,这个后续会讲。
基本语法
在上节我们其实已经略微介绍过了,变量声明的基本语法是:
var 变量名 类型
其中我们可以选择在声明时直接赋值,如果不显式赋值,则会对变量进行零值初始化: 数值类型为 0,布尔类型为 false,字符串为 "",还有空指针等。基本用法示例:
var username string = "张三"
var age int = 20
fmt.Println(username, age) // 张三 20
多变量声明
一次声明多个相同类型的变量:
var username, sex string = "张三", "男"
fmt.Println(username, sex) // 张三 男
批量声明
可以使用括号进行批量声明:
var (
a string
b int
c bool
)
a = "张三"
b = 20
c = true
批量声明并赋值:
var (
a string = "张三"
b int = 20
c bool = true
)
类型推导
编译器可以根据右侧的值自动推导变量类型,多数情况下都可以推导出来,不过还是建议写上明确的类型:
var name = "Q1mi" // 自动推导为 string
var age = 18 // 自动推导为 int
短变量声明
在函数内部可以使用 :=
进行简化声明,这种方式必须给它一个初始值:
func main() {
n := 10 // 等价于 var n = 10
m1, m2, m3 := 10, 20, 30 // 多变量简化声明
fmt.Println(n, m1, m2, m3)
}
注意::=
只能在函数内部使用,不能用于全局变量。
匿名变量
使用下划线 _
表示匿名变量,用于忽略不需要的返回值:
func getInfo() (int, string) {
return 10, "张三"
}
func main() {
_, username := getInfo() // 忽略第一个返回值
fmt.Println(username)
}
匿名变量不占用命名空间,不会分配内存。
常量
常量是恒定不变的值,使用 const
关键字声明,必须在定义时赋值。
基本语法
const pi float64 = 3.1415
const e float64 = 2.7182
// 等价于: const pi, e float64 = 3.1415, 2.7182
// 或者批量声明
const (
pi float64 = 3.1415
e float64 = 2.7182
)
如果批量声明时省略值和类型,则表示和上一行相同:
const (
n1 int = 100
n2 // n2 = 100
n3 // n3 = 100
)
iota 枚举器
iota
是常量计数器,只能在常量表达式中使用,在 const 关键字出现时将被重置为 0,const 批量声明中每新增一行常量声明将使 iota 计数一次,因此可理解为 const 语句块中的行索引:
const (
n1 int = iota // 0
n2 // 1
n3 // 2
)
还有一些高级用法:
// 跳过某些值
const (
n1 int = iota // 0
n2 // 1
_ // 跳过 2
n4 // 3
)
// 中间插队
const (
n1 int = iota // 0
n2 int = 100 // 100
n3 int = iota // 2
n4 // 3
)
// 多个变量
const (
a, b = iota + 1, iota + 2 // 1, 2
c, d // 2, 3
)
格式化代码
go 自带命令可以用于格式化代码:
go fmt main.go
这个会移除无用 import,删除行末分号,修改代码块位置等,可以确保所有 go 程序格式都是一致的,当然有了插件的加持,保存时会默认进行格式化。