golang语法-----变量、常量
变量
1、声明与初始化
(1)标准声明 (先声明,后赋值)
var age int // 声明一个 int 类型的变量 age,此时 age 的值是 0
fmt.Println(age) // 输出: 0age = 30 // 给 age 赋值
fmt.Println(age) // 输出: 30//int 的零值是 0
//float 的零值是 0.0
//bool 的零值是 false
//string 的零值是 "" (空字符串)
//指针、切片、map、channel、函数等引用类型的零值是 nil
(2)声明的同时初始化(最常用)
var name string = "张三"
var height float64 = 1.75
(3)类型推断
var name = "李四" // 编译器自动推断 name 是 string 类型
var isStudent = true // 编译器自动推断 isStudent 是 bool 类型
(4)短变量声明 :=
(只可以在函数内部使用)
func main() {// 不能在函数外使用 a := 10// 声明并初始化city := "北京" // 等价于 var city string = "北京"count := 100 // 等价于 var count int = 100// 重复声明会报错// count := 200 // 编译错误: no new variables on left side of :=// 但如果左侧有新变量,就可以对已有变量重新赋值count, err := doSomething() // 这是合法的,因为 err 是新变量
}
(5)分组声明
// 包级别变量分组,这是类型推断
var (AppName = "MyApp"AppVersion = "1.0.0"Author string
)func main() {// 函数内局部变量分组,这是标准声明var (user stringid inttoken string)user, id, token = "admin", 1, "xyz-abc"
}
注意:
空白标识符 _
被称为匿名变量,主要用于忽略函数返回的不需要的值
比如:
// io.WriteString 返回写入的字节数和一个错误
// 我只关心错误,不关心写入了多少字节,所以用 _ 忽略第一个返回值
_, err := io.WriteString(file, "hello")
常量
1、声明与初始化
(1)单个声明
和变量类似,同样支持类型推断。
const Pi float64 = 3.14159
const AppTitle = "我的应用" // 自动推断为 string
(2)分组声明
定义多个相关常量的推荐方式。
const (StatusOK = 200StatusNotFound = 404
)
2、常量的核心特性
(1)不可变性:一旦声明,不可改变
(2)编译时确定:常量的值必须是在编译期间就能计算出来的表达式。不能是函数调用(运行时)的结果。
const a = 10 + 20 // 合法,编译时可以计算
const b = len("hello") // 合法,len() 是内置函数,编译时可确定// const randNum = rand.Intn(100) // 编译错误,rand.Intn() 是运行时函数
(3)特殊常量iota
iota
是 Go 语言常量组中的一个非常有用的工具,它是一个可以被编译器修改的常量。
iota
只能在const
声明块中使用。- 每个
const
块开始时,iota
的值被重置为0
。 - 在
const
块中,每新增一行常量声明,iota
的值会自动递增1
。
iota
非常适合用来定义一组连续的整数,比如枚举、状态码、星期等。
const (Sunday = iota // 0Monday // 1 (自动继承上一行的表达式,iota 递增)Tuesday // 2Wednesday // 3
)
const (_ = iota // iota = 0, 忽略 0KB = 1 << (10 * iota) // iota = 1, 1 << (10*1) = 1024MB = 1 << (10 * iota) // iota = 2, 1 << (10*2) = 1048576GB = 1 << (10 * iota) // iota = 3TB = 1 << (10 * iota) // iota = 4
)
// `const` 块在这里结束,iota "消失"了。
注意:
无法在 const
代码块的外面打印 iota
的值。iota
并不是一个普通的变量,它是一个特殊的标识符,只在 const
声明块内部有效。
可以把 iota
想象成一个只在 const
工厂里工作的“临时计数器”
- 生命周期:当 Go 编译器遇到
const (
时,这个计数器就被创建并重置为 0。 - 工作内容:在
const
代码块内,每定义一个新常量(每换一行),这个计数器就自动加 1。 - 结束:当
const
代码块结束时(遇到)
),这个“临时计数器”就被销毁了。