Go語言中make和new函數(shù)的用法與區(qū)別
相同點:
make和new都是用來創(chuàng)建分配類型內(nèi)存的。
不同點:
先看下面的代碼
package main
import "fmt"
func main(){
var i *int
var x = 10
*i=x
fmt.Println(*i)
}編譯過程會出錯
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 沒有初始化,所以并不知道 *i的地址是什么,如果直接 *i的賦值為10,那么肯定是不行的(10這個地址沒有)
所以要想使用 *i,需要把 x的地址給i,修改成如下代碼
var i *int var x = 10 i=&x fmt.Println(*i)
補充: * 代表取地址里內(nèi)容, &代表取地址
或者使用 new 進(jìn)行初始化,代碼如下:
var x = 10 var i *int i = new(int) *i=x fmt.Println(*i)
new的源代碼如下
它只接受一個參數(shù),這個參數(shù)是一個類型,分配好內(nèi)存后,返回一個指向該類型內(nèi)存地址的指針。同時請注意它同時把分配的內(nèi)存置為零,也就是類型的零值。

make也是用于內(nèi)存分配的,但是和new不同,它只用于chan、map以及slice的內(nèi)存創(chuàng)建,
而且它返回的類型就是這三個類型本身,而不是他們的指針類型,因為這三種類型就是引用類型,所以就沒有必要返回他們的指針了。
綜上:
二者都是內(nèi)存的分配(堆上)
區(qū)別1
- make只用于slice、map以及channel的初始化(非零值);
- new用于類型的內(nèi)存分配,并且內(nèi)存置為零。
區(qū)別2
- make返回的還是這三個引用類型本身;
- new返回的是指向類型的指針。
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
一文帶你了解Go語言fmt標(biāo)準(zhǔn)庫輸出函數(shù)的使用
這篇文章主要為大家詳細(xì)介紹了Go語言中 fmt 標(biāo)準(zhǔn)庫輸出函數(shù)的使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12
Golang語言如何讀取http.Request中body的內(nèi)容
這篇文章主要介紹了Golang語言如何讀取http.Request中body的內(nèi)容問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03
Golang學(xué)習(xí)筆記之安裝Go1.15版本(win/linux/macos/docker安裝)
這篇文章主要介紹了Golang學(xué)習(xí)筆記之安裝Go1.15版本(win/linux/macos/docker安裝),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
Go語言基礎(chǔ)switch條件語句基本用法及示例詳解
這篇文章主要為大家介紹了Go語言基礎(chǔ)switch條件語句基本用法及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11

