go语言:短变量声明:= 作者:马育民 • 2026-10-05 09:34 • 阅读:10000 # 介绍 `:=` 叫**短变量声明**,只能在**函数内部**使用,作用:**自动推导变量类型 + 声明并赋值**。 > 语法:`变量名 := 值` # 1. 基础示例 ```go 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` 写法: ```go var a int = 10 var b string = "hello" ``` `:=` 省去写类型,代码更简洁。 # 2. 关键规则 ### ✅ 规则1:只能写在**函数内** **包级别(全局)不能用 `:=`**,全局变量只能用 `var` ```go package main // 错误!全局不能 := // num := 10 var num = 10 // 全局只能 var func main() { x := 100 // ✅ 函数内可以 } ``` ### ✅ 规则2:**至少要有一个新变量**(多变量场景) 一行可以多个变量,**不能全部都是已经声明过的变量**。 ```go func main() { a := 1 b := 2 // ✅ 可以:b已经存在,但c是新变量 b, c := 3, 4 // ❌ 错误:a、b都已经声明,没有新变量 a, b := 5, 6 } ``` > 注意:变量是**同一作用域**才算已经声明。 ### ✅ 规则3:自动类型推导,**变量类型不能改变** 一旦 `:=` 推导类型确定,后续不能赋值其他类型: ```go func main() { x := 10 x = 20 // ✅ 同类型,可以修改值 // x = "abc" // ❌ int 不能赋值字符串 } ``` ### ✅ 规则4:声明 + 赋值一体,**不能只声明不赋值** ```go // var x int // 可以只声明不赋值 // x := // ❌ 语法错误,:= 必须给值 ``` # 3. 和 var 的对比 | 写法 | 可用位置 | 是否需要赋值 | 类型 | |---|---|---|---| | `var a int = 10` | 全局 / 函数内 | 可选 | 手动指定 | | `var a = 10` | 全局 / 函数内 | 必须赋值 | 自动推导 | | `a := 10` | **仅函数内** | 必须赋值 | 自动推导 | ### 使用建议 1. **函数内部,立刻赋值** → 优先 `:=`,简洁 2. **全局变量** → 只能 `var` 3. **先声明,后面再赋值**(例如先定义变量,if里赋值)→ `var` ```go func main() { var x int if true { x = 100 } } ``` # 4. 常见坑 ### 坑1:作用域问题(if/for 内部新变量遮蔽外层) ```go 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:函数返回值接收,常用 `:=` ```go func test() (int, error) { return 100, nil } func main() { res, err := test() // 非常常见写法,声明res、err if err != nil { return } } ``` 原文出处:/show_1GW4AeHFfUa6.html