Go語(yǔ)言中make和new函數(shù)的用法與區(qū)別
相同點(diǎn):
make和new都是用來(lái)創(chuàng)建分配類型內(nèi)存的。
不同點(diǎn):
先看下面的代碼
package main import "fmt" func main(){ var i *int var x = 10 *i=x fmt.Println(*i) }
編譯過(guò)程會(huì)出錯(cuò)
panic: runtime error: invalid memory address or nil pointer dereference <br data-filtered="filtered">[signal 0xc0000005 code=0x1 addr=0x0 pc=0x48b576]
我們的想法是把 10 賦值 i指向的地址,但是這里由于 *i 沒(méi)有初始化,所以并不知道 *i的地址是什么,如果直接 *i的賦值為10,那么肯定是不行的(10這個(gè)地址沒(méi)有)
所以要想使用 *i,需要把 x的地址給i,修改成如下代碼
var i *int var x = 10 i=&x fmt.Println(*i)
補(bǔ)充: * 代表取地址里內(nèi)容
, &代表取地址
或者使用 new 進(jìn)行初始化,代碼如下:
var x = 10 var i *int i = new(int) *i=x fmt.Println(*i)
new的源代碼如下
它只接受一個(gè)參數(shù),這個(gè)參數(shù)是一個(gè)類型,分配好內(nèi)存后,返回一個(gè)指向該類型內(nèi)存地址的指針。同時(shí)請(qǐng)注意它同時(shí)把分配的內(nèi)存置為零,也就是類型的零值。
make也是用于內(nèi)存分配的,但是和new不同,它只用于chan、map以及slice的內(nèi)存創(chuàng)建,
而且它返回的類型就是這三個(gè)類型本身,而不是他們的指針類型,因?yàn)檫@三種類型就是引用類型,所以就沒(méi)有必要返回他們的指針了。
綜上:
二者都是內(nèi)存的分配(堆上)
區(qū)別1
- make只用于slice、map以及channel的初始化(非零值);
- new用于類型的內(nèi)存分配,并且內(nèi)存置為零。
區(qū)別2
- make返回的還是這三個(gè)引用類型本身;
- new返回的是指向類型的指針。
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
Go與Redis實(shí)現(xiàn)分布式互斥鎖和紅鎖
這篇文章主要介紹了Go與Redis實(shí)現(xiàn)分布式互斥鎖和紅鎖,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09Golang算法問(wèn)題之整數(shù)拆分實(shí)現(xiàn)方法分析
這篇文章主要介紹了Golang算法問(wèn)題之整數(shù)拆分實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Go語(yǔ)言數(shù)值運(yùn)算與數(shù)組遍歷相關(guān)操作技巧,需要的朋友可以參考下2017-02-02golang?gorm學(xué)習(xí)之如何指定數(shù)據(jù)表
在sql中首先要指定是從哪張表中查詢,所以這篇文章小編就來(lái)帶大家一起看一下gorm是如何根據(jù)model來(lái)自動(dòng)解析表名的,感興趣的小伙伴可以了解下2023-08-08Go中的關(guān)鍵字any interface是否會(huì)成為歷史
這篇文章主要為大家介紹了Go中的關(guān)鍵字any interface是否會(huì)成為歷史的講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07GO語(yǔ)言中創(chuàng)建切片的三種實(shí)現(xiàn)方式
這篇文章主要介紹了GO語(yǔ)言中創(chuàng)建切片的三種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09