go语言:短变量声明:=

介绍

:= 叫短变量声明,只能在函数内部使用,作用:自动推导变量类型 + 声明并赋值。

语法:变量名 := 值

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 仅函数内 必须赋值 自动推导

使用建议

  1. 函数内部,立刻赋值 → 优先 :=,简洁
  2. 全局变量 → 只能 var
  3. 先声明,后面再赋值(例如先定义变量,if里赋值)→ var
    func 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
    }
}