介绍
:= 叫短变量声明,只能在函数内部使用,作用:自动推导变量类型 + 声明并赋值。
语法:
变量名 := 值
1. 基础示例
package main
import "fmt"
func main() {
a := 10 // 等价 var a int = 10,自动推导 a 是 int
b := "hello" // string
c := 3.14 // float64
d := true // bool
fmt.Println(a, b, c, d)
}
对比 var 写法:
var a int = 10
var b string = "hello"
:= 省去写类型,代码更简洁。
2. 关键规则
✅ 规则1:只能写在函数内
包级别(全局)不能用 :=,全局变量只能用 var
package main
// 错误!全局不能 :=
// num := 10
var num = 10 // 全局只能 var
func main() {
x := 100 // ✅ 函数内可以
}
✅ 规则2:至少要有一个新变量(多变量场景)
一行可以多个变量,不能全部都是已经声明过的变量。
func main() {
a := 1
b := 2
// ✅ 可以:b已经存在,但c是新变量
b, c := 3, 4
// ❌ 错误:a、b都已经声明,没有新变量
a, b := 5, 6
}
注意:变量是同一作用域才算已经声明。
✅ 规则3:自动类型推导,变量类型不能改变
一旦 := 推导类型确定,后续不能赋值其他类型:
func main() {
x := 10
x = 20 // ✅ 同类型,可以修改值
// x = "abc" // ❌ int 不能赋值字符串
}
✅ 规则4:声明 + 赋值一体,不能只声明不赋值
// var x int // 可以只声明不赋值
// x := // ❌ 语法错误,:= 必须给值
3. 和 var 的对比
| 写法 | 可用位置 | 是否需要赋值 | 类型 |
|---|---|---|---|
var a int = 10 |
全局 / 函数内 | 可选 | 手动指定 |
var a = 10 |
全局 / 函数内 | 必须赋值 | 自动推导 |
a := 10 |
仅函数内 | 必须赋值 | 自动推导 |
使用建议
- 函数内部,立刻赋值 → 优先
:=,简洁 - 全局变量 → 只能
var - 先声明,后面再赋值(例如先定义变量,if里赋值)→
varfunc main() { var x int if true { x = 100 } }
4. 常见坑
坑1:作用域问题(if/for 内部新变量遮蔽外层)
func main() {
x := 10
if true {
x := 20 // 这里是新变量!遮蔽外面的x,不是修改外层x
fmt.Println(x) // 20
}
fmt.Println(x) // 10
}
很多人误以为 x :=20 是修改外层 x,实际是在if块里新建同名变量。
如果想修改外层,改成
x = 20。
坑2:函数返回值接收,常用 :=
func test() (int, error) {
return 100, nil
}
func main() {
res, err := test() // 非常常见写法,声明res、err
if err != nil {
return
}
}