根據官方文檔描述golang
make是用來分配而且初始化slice,map,chan等類型的對象 new也是用來分配內存的,返回對應內向的0值的指針,但並不初始化對象
看下面例子,就很明顯了函數
a := new([]int) b := make([]int,1) fmt.Println(a) fmt.Println(b) fmt.Println(unsafe.Sizeof(*a)) fmt.Println(unsafe.Sizeof(b)+unsafe.Sizeof([1]int{})) output: &[] [0] 24 32
make在初始化不一樣類型對象時,會調用不一樣的函數.ui
make slice時會調用 runtime.makeslice
make map時會調用 runtime.makemap或者runtime.makemap_small
make chan 時會調用 runtime.makechan指針
b := make([]int,1) fmt.Println(b)
以slice爲例,轉成彙編後能看見以下代碼code
PCDATA $0, $0 CALL runtime.makeslice(SB) 這裏 MOVQ 32(SP), AX MOVQ 24(SP), CX MOVQ 40(SP), DX
PCDATA $0, $0 CALL runtime.makemap_small(SB) MOVQ (SP), AX
如下面代碼爲例對象
a := new([]int) fmt.Println(a)
轉成彙編語言後能看下以下代碼:內存
PCDATA $0, $0 CALL runtime.newobject(SB) MOVQ 8(SP), AX XORPS X0, X0
能夠看到最終會調用runtime.newobject來分配內存,而且返回指針文檔
func newobject(typ *_type) unsafe.Pointer { return mallocgc(typ.size, typ, true) }
https://golang.org/pkg/builti...
https://golang.org/pkg/builti...get