欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入講解Go語(yǔ)言中函數(shù)new與make的使用和區(qū)別

 更新時(shí)間:2017年10月25日 09:45:22   作者:飛雪無(wú)情  
大家都知道Go語(yǔ)言中的函數(shù)new與函數(shù)make一直是新手比較容易混淆的東西,看著相似,但其實(shí)不同,不過(guò)解釋兩者之間的不同也非常容易,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言中函數(shù)new與make區(qū)別的相關(guān)資料,需要的朋友可以參考下。

前言

本文主要給大家介紹了Go語(yǔ)言中函數(shù)new與make的使用和區(qū)別,關(guān)于Go語(yǔ)言中new和make是內(nèi)建的兩個(gè)函數(shù),主要用來(lái)創(chuàng)建分配類型內(nèi)存。在我們定義生成變量的時(shí)候,可能會(huì)覺(jué)得有點(diǎn)迷惑,其實(shí)他們的規(guī)則很簡(jiǎn)單,下面我們就通過(guò)一些示例說(shuō)明他們的區(qū)別和使用,話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。

變量的聲明

var i int
var s string

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

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

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

這個(gè)例子會(huì)打印出什么?0還是10?。以上全錯(cuò),運(yùn)行的時(shí)候會(huì)painc,原因如下:

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

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

對(duì)于值類型的聲明不需要,是因?yàn)橐呀?jīng)默認(rèn)幫我們分配好了。

要分配內(nèi)存,就引出來(lái)今天的new和make。

new

對(duì)于上面的問(wèn)題我們?nèi)绾谓鉀Q呢?既然我們知道了沒(méi)有為其分配內(nèi)存,那么我們使用new分配一個(gè)吧。

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

現(xiàn)在再運(yùn)行程序,完美PASS,打印10?,F(xiàn)在讓我們看下new這個(gè)內(nèi)置的函數(shù)。

// 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

它只接受一個(gè)參數(shù),這個(gè)參數(shù)是一個(gè)類型,分配好內(nèi)存后,返回一個(gè)指向該類型內(nèi)存地址的指針。同時(shí)請(qǐng)注意它同時(shí)把分配的內(nèi)存置為零,也就是類型的零值。

我們的例子中,如果沒(méi)有*i=10,那么打印的就是0。這里體現(xiàn)不出來(lái)new函數(shù)這種內(nèi)存置為零的好處,我們?cè)倏匆粋€(gè)例子。

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字段我不用初始化,直接可以拿來(lái)用,不會(huì)有無(wú)效內(nèi)存引用異常,因?yàn)樗呀?jīng)被零值了。

這就是new,它返回的永遠(yuǎn)是類型的指針,指向分配類型的內(nèi)存地址。

make

make也是用于內(nèi)存分配的,但是和new不同,它只用于chan、map以及切片的內(nèi)存創(chuàng)建,而且它返回的類型就是這三個(gè)類型本身,而不是他們的指針類型,因?yàn)檫@三種類型就是引用類型,所以就沒(méi)有必要返回他們的指針了。

注意,因?yàn)檫@三種類型是引用類型,所以必須得初始化,但是不是置為零值,這個(gè)和new是不一樣的。

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

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

二者異同

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

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

其實(shí)new不常用

所以有new這個(gè)內(nèi)置函數(shù),可以給我們分配一塊內(nèi)存讓我們使用,但是現(xiàn)實(shí)的編碼中,它是不常用的。我們通常都是采用短語(yǔ)句聲明以及結(jié)構(gòu)體的字面量達(dá)到我們的目的,比如:

i:=0
u:=user{}

這樣更簡(jiǎn)潔方便,而且不會(huì)涉及到指針這種比麻煩的操作。

make函數(shù)是無(wú)可替代的,我們?cè)谑褂胹lice、map以及channel的時(shí)候,還是要使用make進(jìn)行初始化,然后才才可以對(duì)他們進(jìn)行操作。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • go語(yǔ)言文件正則表達(dá)式搜索功能示例

    go語(yǔ)言文件正則表達(dá)式搜索功能示例

    這篇文章主要介紹了go語(yǔ)言文件正則表達(dá)式搜索功能,涉及Go語(yǔ)言文件目錄的遍歷及正則操作相關(guān)技巧,需要的朋友可以參考下
    2017-01-01
  • Go語(yǔ)言反射reflect.Value實(shí)現(xiàn)方法的調(diào)用

    Go語(yǔ)言反射reflect.Value實(shí)現(xiàn)方法的調(diào)用

    本文主要介紹了Go語(yǔ)言反射reflect.Value實(shí)現(xiàn)方法的調(diào)用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Go語(yǔ)言使用select{}阻塞main函數(shù)介紹

    Go語(yǔ)言使用select{}阻塞main函數(shù)介紹

    這篇文章主要介紹了Go語(yǔ)言使用select{}阻塞main函數(shù)介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • Go?mod包管理工具詳解

    Go?mod包管理工具詳解

    Go?mod作為Go語(yǔ)言的官方包管理工具,可以幫助開(kāi)發(fā)者更好地管理包和依賴,提高開(kāi)發(fā)效率和項(xiàng)目可維護(hù)性,本文將介紹Go語(yǔ)言的包和依賴管理,以及Go?mod的作用和優(yōu)勢(shì),需要的朋友可以參考下
    2023-05-05
  • 一文教你如何在Golang中用好泛型

    一文教你如何在Golang中用好泛型

    golang的泛型已經(jīng)出來(lái)了一年多了,從提案被接受開(kāi)始我就在關(guān)注泛型了,好用是好用,但問(wèn)題也很多,所以本文就來(lái)教大家如何在Golang中用好泛型吧
    2023-07-07
  • GoLang函數(shù)棧的使用詳細(xì)講解

    GoLang函數(shù)棧的使用詳細(xì)講解

    這篇文章主要介紹了GoLang函數(shù)棧的使用,我們的代碼會(huì)被編譯成機(jī)器指令并寫入到可執(zhí)行文件,當(dāng)程序執(zhí)行時(shí),可執(zhí)行文件被加載到內(nèi)存,這些機(jī)器指令會(huì)被存儲(chǔ)到虛擬地址空間中的代碼段,在代碼段內(nèi)部,指令是低地址向高地址堆積的
    2023-02-02
  • 輕松入門:使用Golang開(kāi)發(fā)跨平臺(tái)GUI應(yīng)用

    輕松入門:使用Golang開(kāi)發(fā)跨平臺(tái)GUI應(yīng)用

    Golang是一種強(qiáng)大的編程語(yǔ)言,它的并發(fā)性和高性能使其成為開(kāi)發(fā)GUI桌面應(yīng)用的理想選擇,Golang提供了豐富的標(biāo)準(zhǔn)庫(kù)和第三方庫(kù),可以輕松地創(chuàng)建跨平臺(tái)的GUI應(yīng)用程序,通過(guò)使用Golang的GUI庫(kù),開(kāi)發(fā)人員可以快速構(gòu)建具有豐富用戶界面和交互功能的應(yīng)用程序,需要的朋友可以參考下
    2023-10-10
  • 一文初探Go語(yǔ)言中的reflect反射包

    一文初探Go語(yǔ)言中的reflect反射包

    這篇文章主要和大家分享一下Go語(yǔ)言中的reflect反射包,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的小伙伴可以參考一下
    2022-12-12
  • go-cqhttp權(quán)限管理系統(tǒng)的實(shí)現(xiàn)代碼

    go-cqhttp權(quán)限管理系統(tǒng)的實(shí)現(xiàn)代碼

    這篇文章主要介紹了go-cqhttp權(quán)限管理,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • Golang中互斥鎖和讀寫互斥鎖原理及示例代碼

    Golang中互斥鎖和讀寫互斥鎖原理及示例代碼

    在Golang中,互斥鎖是一種基本的同步原語(yǔ),用于實(shí)現(xiàn)對(duì)共享資源的互斥訪問(wèn),讀寫互斥鎖是一種特殊類型的互斥鎖,它允許多個(gè)協(xié)程同時(shí)讀取某個(gè)共享資源,本文將通過(guò)過(guò)示例代碼詳細(xì)介紹Golang中互斥鎖和讀寫互斥鎖,需要的朋友可以參考下
    2023-05-05

最新評(píng)論