make和new
- new(T) 和 make(T, args) 是Go語(yǔ)?內(nèi)建函數(shù),?來(lái)分配內(nèi)存,但適?的類型不?。
- new(T) 會(huì)為了 T 類型的新值分配已置零的內(nèi)存空間,并返回地址(指針),即類型為 *T 的
值。換句話說(shuō)就是,返回?個(gè)指針,該指針指向新分配的、類型為 T 的零值。適?于值類型,如數(shù)組 、 結(jié)構(gòu)體 等。 - make(T, args) 返回初始化之后的T類型的值,也不是指針 *T ,是經(jīng)過(guò)初始化之后的T的引?。
- make() 只適?于 slice 、 map 和 channel 。
函數(shù)傳值問(wèn)題
Go只有值傳遞,沒(méi)有引用傳遞的。
map,chan,slice是引用類型,作為參數(shù)傳遞后修改,會(huì)改變其指向內(nèi)存的值。
而slice作為參數(shù)傳遞,實(shí)際上是把整個(gè)slice結(jié)構(gòu)體拷貝一次,但因?yàn)閮?nèi)部保存了引用數(shù)組的指針,所以也可以修改其指向內(nèi)存的值。
注意引用類型和傳引用是兩個(gè)概念,想修改原內(nèi)容數(shù)據(jù),就要傳遞引用類型,即map,chan,slice或原內(nèi)容數(shù)據(jù)的指針。
defer與return
主要是 無(wú)名返回值和命名返回值return返回的差異
defer、return、返回值三者的執(zhí)行順序應(yīng)該是:return最先給返回值賦值;接著defer開始執(zhí)行一些收尾工作;最后RET指令攜帶返回值退出函數(shù)。
如果是無(wú)名返回值,defer中的操作與函數(shù)最終返回值無(wú)關(guān);
如果是有名返回值,且在函數(shù)體中是直接給有名變量賦值,而defer中對(duì)有名變量的操作與函數(shù)最終返回值有關(guān),否則無(wú)關(guān)。