Go 语言 里 `var`、`make`、`new`、`:=` 的区别
把 Go 语言 里 var
、make
、new
、:=
的区别彻底梳理一下。
1️⃣ var
作用:声明变量(可以带初始值,也可以不带)。
-
语法:
var a int // 声明整型变量,默认值为 0 var b string // 默认值 "" var c = 10 // 类型推断为 int var d int = 20 // 显式类型
-
特点:
- 不赋值时,自动初始化为零值(0、“”、nil 等)。
- 适用于包级变量或需要显式声明类型的地方。
- 不能在函数体外用
:=
,但var
可以。
2️⃣ :=
(短变量声明)
作用:声明并初始化变量(只能在函数内用)。
-
语法:
x := 100 // 类型推断为 int y := "hello" // 类型推断为 string
-
特点:
-
必须同时声明并赋值。
-
只能在函数内部使用。
-
适合局部变量,简洁方便。
-
如果左边变量部分已声明,
:=
会更新未声明的部分:a := 1 a, b := 2, 3 // a 已存在,更新值;b 新声明
-
3️⃣ new
作用:为某种类型分配内存,返回该类型的指针(零值)。
-
语法:
p := new(int) // *int 类型,指向的值是 0 *p = 100 // 修改指针指向的值 fmt.Println(*p) // 100
-
特点:
-
只分配内存,不初始化(除了零值)。
-
返回的是指针类型(
*T
)。 -
多用于需要指针的场景,比如:
type Person struct { Name string } p := new(Person) // *Person
-
4️⃣ make
作用:只用于创建 slice、map、channel,并完成初始化。
-
语法:
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️⃣ 直观示例对比
package mainimport "fmt"func main() {// varvar a int // 0var b = 42 // 42fmt.Println(a, b)// :=c := "hello"fmt.Println(c)// newp := new(int) // *intfmt.Println(*p) // 0*p = 99fmt.Println(*p) // 99// makem := make(map[string]int)m["go"] = 2025fmt.Println(m)
}