一、三种变量声明方式
1.1 var + 类型(最正式)
var name string = "pc"
var age int = 25
适用场景:
- 声明包级变量(函数外面)
- 需要明确指定类型
- 希望代码读起来一目了然
1.2 var + 类型推断(省去类型)
var name = "pc" // Go 自动推断为 string
var age = 25 // 自动推断为 int
Go 会根据右边的值自动推断类型,不用每次都写类型。
1.3 := 短声明(最常用,函数内专用)
name := "pc"
age := 25
特点:
- 只能在函数内部使用
- 最简洁,日常写代码最常用
- 可以配合多返回值:
count, err := doSomething() :=允许混合使用新变量和已有变量:
count, err := doSomething() // count 和 err 都是新的
total, err := doNext() // err 已存在,只是重新赋值;total 是新变量
对比总结
| 写法 | 位置限制 | 可读性 | 使用频率 |
|---|---|---|---|
var x int = 10 | 无限制 | ⭐⭐⭐ 最高 | 包级变量 / 明确类型 |
var x = 10 | 无限制 | ⭐⭐ | 包级变量 |
x := 10 | 仅函数内 | ⭐ 最简洁 | 日常最高 ✅ |
二、Go 的基本类型
2.1 数值类型
var (
a int = 42 // 平台相关:32位或64位
b int8 = 127 // -128 ~ 127
c int16 = 32767 // -32768 ~ 32767
d int32 = 20 // -21亿 ~ 21亿
e int64 = 100 // 很大的数
f uint = 100 // 无符号整数
g byte = 'A' // byte = uint8 的别名,值 = 65
)
浮点数:
var (
price float32 = 19.9 // 精度较低
pi float64 = 3.1415926 // 精度高,推荐使用 ✅
)
💡 原则:整数用
int,小数用float64,除非有特殊需求。
2.2 布尔类型
var enabled bool = true
var disabled bool = false
布尔值只能为 true 或 false,不能像 Python 那样用 0 / 1 代替。
2.3 字符串类型
var name string = "Go语言"
// 字符串可以拼接
greeting := "你好," + "Go"
// 取长度
fmt.Println(len("Go")) // 2
// 索引取值(拿到的是 byte)
fmt.Println("Go"[0]) // 71('G' 的 ASCII)
⚠️ 注意:Go 字符串的
len()返回的是字节数,不是字符数。中文等 Unicode 字符可能占多个字节。
2.4 零值(默认值)
Go 的每个变量都有默认值,不存在"未初始化"的情况:
| 类型 | 零值 |
|---|---|
int / 所有数值类型 | 0 |
float64 | 0.0 |
bool | false |
string | ""(空字符串) |
| 指针 / 接口 / 切片 / map | nil |
var num int // num = 0,不需要写 = 0
var str string // str = "",可以直接用
三、批量声明
当有多个变量时,可以用 var() 块批量声明,让代码更整洁:
var (
name string = "pc"
age int = 25
enabled bool = true
score int // 不赋值,默认 0
)
四、值得注意的细节
1. Go 不允许声明了变量却不使用
a := 1
b := 2
fmt.Println(a) // ❌ 编译错误:b declared but not used
这是 Go 的设计哲学——代码必须干净。不用的变量就删掉或用 _ 忽略。
2. = 与 := 的区别
x := 10 // := 声明 + 赋值(变量不存在时使用)
x = 20 // = 只赋值(变量已存在时使用)
五、小结
| 概念 | 要点 |
|---|---|
| 声明方式 | var x T = v / var x = v / x := v |
| 函数内 | 优先用 := |
| 函数外 | 只能用 var |
| 基本类型 | int、float64、bool、string、byte |
| 零值 | 每个变量都有默认值,不会为空 |
| 未使用 | Go 编译不通过,必须用掉或删掉 |