把 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)
}