Go 语言 里 `var`、`make`、`new`、`:=` 的区别

Go 语言varmakenew:= 的区别彻底梳理一下。


1️⃣ var

作用:声明变量(可以带初始值,也可以不带)。

  • 语法

    go 复制代码
    var a int        // 声明整型变量,默认值为 0
    var b string     // 默认值 ""
    var c = 10       // 类型推断为 int
    var d int = 20   // 显式类型
  • 特点

    • 不赋值时,自动初始化为零值(0、""、nil 等)。
    • 适用于包级变量或需要显式声明类型的地方。
    • 不能 在函数体外用 :=,但 var 可以。

2️⃣ :=(短变量声明)

作用:声明并初始化变量(只能在函数内用)。

  • 语法

    go 复制代码
    x := 100          // 类型推断为 int
    y := "hello"      // 类型推断为 string
  • 特点

    • 必须同时声明并赋值

    • 只能在函数内部使用。

    • 适合局部变量,简洁方便。

    • 如果左边变量部分已声明:= 会更新未声明的部分:

      go 复制代码
      a := 1
      a, b := 2, 3 // a 已存在,更新值;b 新声明

3️⃣ new

作用 :为某种类型分配内存 ,返回该类型的指针(零值)。

  • 语法

    go 复制代码
    p := new(int)     // *int 类型,指向的值是 0
    *p = 100          // 修改指针指向的值
    fmt.Println(*p)   // 100
  • 特点

    • 只分配内存,不初始化(除了零值)。

    • 返回的是指针类型*T)。

    • 多用于需要指针的场景,比如:

      go 复制代码
      type Person struct { Name string }
      p := new(Person) // *Person

4️⃣ make

作用只用于创建 slice、map、channel,并完成初始化。

  • 语法

    go 复制代码
    s := make([]int, 5, 10)   // 长度5,容量10的切片
    m := make(map[string]int) // 空map
    ch := make(chan int, 3)   // 缓冲区大小为3的channel
  • 特点

    • make分配内存初始化底层数据结构
    • 返回的是引用类型本身(不是指针)。
    • new 不同:new 返回指针,make 返回初始化完成的对象。

5️⃣ 区别总结表

关键字 作用 返回类型 用途 初始化
var 声明变量(可选初始值) 值类型(或引用类型) 全局变量/局部变量 默认零值
:= 声明并赋值(只能函数内) 值类型(或引用类型) 局部变量 需要立即赋值
new 分配内存 指针类型(*T 任意类型 仅零值
make 创建并初始化 slice、map、chan 引用类型本身 slice/map/chan 已初始化

6️⃣ 直观示例对比

go 复制代码
package main

import "fmt"

func main() {
    // var
    var a int          // 0
    var b = 42         // 42
    fmt.Println(a, b)

    // :=
    c := "hello"
    fmt.Println(c)

    // new
    p := new(int)      // *int
    fmt.Println(*p)    // 0
    *p = 99
    fmt.Println(*p)    // 99

    // make
    m := make(map[string]int)
    m["go"] = 2025
    fmt.Println(m)
}