引入
程序要处理数据,得先把数据存起来。变量就是给数据起个名字,放到内存里,后面想用就通过名字拿。Go 的变量声明方式很灵活,有几种不同的写法,搞清楚什么时候用哪种很重要。
正文
定义
定义
变量用于保存数据,后续可以通过变量名使用这个数据。每个变量有类型,Go 是强类型语言,类型在编译时就确定了。
语法
// 完整声明
var name string = "Tom"
// 类型推断
var age = 18
// 短变量声明(只能在函数内用)
score := 100三种写法对应不同场景:
var name type = value:最完整的写法var name = value:让编译器自己推类型name := value:最简洁,函数内首选
例子
基本声明
var name string = "Alice"
var age int = 25
var height float64 = 1.75
var isStudent bool = true类型推断
var city = "Beijing" // 推断为 string
var score = 95 // 推断为 int
var pi = 3.14 // 推断为 float64编译器会根据右边的值自动推断类型,不用手动写。
短变量声明
func main() {
name := "Bob"
age := 30
fmt.Println(name, age)
}:= 是函数里最常用的声明方式,声明和赋值一步完成。
多变量声明
// 一次声明多个同类型变量
var a, b, c int = 1, 2, 3
// 一次声明多个不同类型变量
var (
name string = "Tom"
age int = 20
city string = "Shanghai"
)用 var () 块可以把相关变量组织在一起,看起来更清晰。
零值
var n int // 0
var f float64 // 0
var s string // ""
var b bool // false
var p *int // nilGo 里声明变量不赋值,会自动给零值,不会出现未初始化的脏数据。
| 类型 | 零值 |
|---|---|
int, float64 | 0 |
string | "" |
bool | false |
| 指针、切片、map、channel、接口、函数 | nil |
常见写法
| 写法 | 使用场景 |
|---|---|
var x int = 10 | 明确指定类型 |
var x = 10 | 类型推断,全局变量常用 |
x := 10 | 函数内局部变量,最常用 |
var a, b int = 1, 2 | 同时声明多个同类型变量 |
var ( … ) | 批量声明多个变量 |
特点
:=只能在函数内使用,函数外必须用var:=是声明+赋值,不能对已声明的变量重复用(除非左侧有新变量)- 零值机制保证变量一定是有值的,不会是随机内存
- 变量声明后必须使用,否则编译报错(Go 的严格要求)
- 类型写在变量名后面,和很多语言不同
// Go 的写法
var name string
// 其他语言的写法(对比)
// string name理解
Go 的变量设计核心是简单且安全。零值机制让你不用操心未初始化的问题,类型推断让你少写代码,:= 让函数内的代码更简洁。强制要求变量必须被使用,逼着你写出更干净的代码。整体思路就是:编译器能做的事,就不让人来做。
引出
变量是可以重新赋值的,但有些数据我们希望它固定不变。这就引出了 Go 常量,看看怎么声明不可变的值。