91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go語言new與make的區別是什么

發布時間:2021-01-22 16:12:40 來源:億速云 閱讀:148 作者:Leah 欄目:編程語言

Go語言new與make的區別是什么?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

變量的聲明

var i int
var s string

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

對于例子中的兩種類型的聲明,我們可以直接使用,對其進行賦值輸出。但是如果我們換成引用類型呢?

package main
import (
 "fmt"
)
func main() {
 var i *int
 *i=10
 fmt.Println(*i)
}

這個例子會打印出什么?0還是10?。以上全錯,運行的時候會painc,原因如下:

panic: runtime error: invalid memory address or nil pointer dereference

從這個提示中可以看出,對于引用類型的變量,我們不光要聲明它,還要為它分配內容空間,否則我們的值放在哪里去呢?這就是上面錯誤提示的原因。

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

要分配內存,就引出來今天的new和make。

new

對于上面的問題我們如何解決呢?既然我們知道了沒有為其分配內存,那么我們使用new分配一個吧。

func main() {
 var i *int
 i=new(int)
 *i=10
 fmt.Println(*i)
}

現在再運行程序,完美PASS,打印10。現在讓我們看下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

它只接受一個參數,這個參數是一個類型,分配好內存后,返回一個指向該類型內存地址的指針。同時請注意它同時把分配的內存置為零,也就是類型的零值。

我們的例子中,如果沒有*i=10,那么打印的就是0。這里體現不出來new函數這種內存置為零的好處,我們再看一個例子。

func main() {
 u:=new(user)
 u.lock.Lock()
 u.name = "張三"
 u.lock.Unlock()
 fmt.Println(u)
}
type user struct {
 lock sync.Mutex
 name string
 age int
}

示例中的user類型中的lock字段我不用初始化,直接可以拿來用,不會有無效內存引用異常,因為它已經被零值了。

這就是new,它返回的永遠是類型的指針,指向分配類型的內存地址。

make

make也是用于內存分配的,但是和new不同,它只用于chan、map以及切片的內存創建,而且它返回的類型就是這三個類型本身,而不是他們的指針類型,因為這三種類型就是引用類型,所以就沒有必要返回他們的指針了。

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

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

從函數聲明中可以看到,返回的還是該類型。

二者異同

所以從這里可以看的很明白了,二者都是內存的分配(堆上),但是make只用于slice、map以及channel的初始化(非零值);而new用于類型的內存分配,并且內存置為零。所以在我們編寫程序的時候,就可以根據自己的需要很好的選擇了。

make返回的還是這三個引用類型本身;而new返回的是指向類型的指針。

其實new不常用

所以有new這個內置函數,可以給我們分配一塊內存讓我們使用,但是現實的編碼中,它是不常用的。我們通常都是采用短語句聲明以及結構體的字面量達到我們的目的,比如:

i:=0
u:=user{}

這樣更簡潔方便,而且不會涉及到指針這種比麻煩的操作。

make函數是無可替代的,我們在使用slice、map以及channel的時候,還是要使用make進行初始化,然后才才可以對他們進行操作。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

台中市| 全椒县| 清原| 准格尔旗| 宾川县| 工布江达县| 津南区| 安西县| 广元市| 上饶市| 夏河县| 额济纳旗| 古浪县| 安溪县| 小金县| 大安市| 南开区| 内黄县| 柞水县| 武清区| 乌兰县| 昌吉市| 嵊泗县| 呼玛县| 北川| 南宫市| 亚东县| 西乡县| 广南县| 楚雄市| 福安市| 铁岭县| 崇礼县| 岗巴县| 光泽县| 务川| 禹州市| 东港市| 白朗县| 曲沃县| 长沙市|