go語言基礎內置函數new和make

 閱讀大約需要1分鐘

go語言基礎內置函數new和make

go語言中的內置函數make和new都是用作變量的初始化,但是它們初始化變量的方式不同,make返回類型是引用類型,new返回類型是指針類型。

內置函數make

內置函數make僅用作分配內存空間並初始化slice,map和chan類型的對象。與new相同,第一個參數是類型,而不是值。與new不同的是make的返回類型與其參數的類型相同,而不是指向它的指針。

func make(t Type, size ...IntegerType) Type

返回值取決於傳參的類型:

因為這三種類型是引用類型,所以必須得初始化,但是不是置為零值,這個和new是不一樣的。

m := make([]int,4)
fmt.Println(m)

m1 := make(map[string]string)
fmt.Println(m1)

m2 := make(chan int)
fmt.Println(m2)

輸入結果如下:

[0 0 0 0]
map[]
0xc00008c060
內置函數new

內置函數new僅用作分配內存空間,第一個參數是類型,而不是值,返回值是指向新分配該類型的零值的指針。

// The new built-in function allocates memory. The first argument is a type,
// not a value, and the value returned is a pointer to a newly
// allocated zero value of that type.
func new(Type) *Type
  • 同時請注意它同時把分配的內存置為零,也就是類型的零值。

變量的聲明我們可以通過var關鍵字,然後就可以在程序中使用。當我們不指定變量的默認值時,這些變量的默認值是他們的零值,比如int類型的零值是0,string類型的零值是"",引用類型的零值是nil。

package main

import "fmt"

func main() {
	var i int
	var s string
	fmt.Println("i's value",i)
	fmt.Println("s's value",s)

	var x *int
	fmt.Println(x)
	x=new(int)
	fmt.Println(*x)
	fmt.Println(x)
	*x=10
	fmt.Println(*x)

}

運行結果如下:

i's value 0
s's value 
<nil>
0
0xc000128008
10

對於引用類型的變量,我們不光要聲明它,還要為它分配內容空間,否則我們的值放在哪裡去呢?

對於值類型的聲明不需要,是因為已經默認幫我們分配好了。

make和new的區別
  • make僅用於初始化slice,map和chan,new可用於初始化任意類型。
  • make返回值是”引用類型“,new返回值是指針類型。

內置函數make是必用的,因為slice,map和chan必須使用內置函數make初始化(非零值)才可以使用。

內置函數new用於類型的內存分配,並且內存置為零,通常使用場景是需要顯式返回指針。