• <track id="em4g6"><strike id="em4g6"></strike></track>
      1. 教育改變生活,株洲科泰成就夢想!
        報名熱線:0731-28161709

        教學課堂CLASSROOM

        開班信息
        熱門話題
        .net技術
        目前所在位置: 首頁 > .net技術

        深入講解Go語言中函數new與make的使用和區別

        來源:北大青鳥科泰校區時間:2019-04-08

        內容提要: 本文主要給大家介紹了Go語言中函數new與make的使用和區別,關于Go語言中new和make是內建的兩個函數,主要用來創建分配類型內存。

        本文主要給大家介紹了Go語言中函數new與make的使用和區別,關于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?,F在讓我們看下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進行初始化,然后才才可以對他們進行操作。
        相關推薦
        ?
        聯系我們

        掃碼關注科泰

        電話咨詢:0731-28161709

        學校地址:株洲市云龍示范區北大青鳥株洲科泰校區

        留言咨詢

        Copyright 株洲科泰信息有限公司 版權所有__湘ICP備19017566號

        久久久久亚洲精品无码网址色欲

      2. <track id="em4g6"><strike id="em4g6"></strike></track>