<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] ## 4、Golang中make與new有何區別? ### 一、**前言** 本文主要給大家介紹了Go語言中函數`new`與`make`的使用和區別,關于Go語言中`new`和`make`是內建的兩個函數,主要用來創建分配類型內存。在我們定義生成變量的時候,可能會覺得有點迷惑,其實他們的規則很簡單,下面我們就通過一些示例說明他們的區別和使用。 ### 二、變量的聲明 ```go var i int var s string ``` ? 變量的聲明我們可以通過var關鍵字,然后就可以在程序中使用。當我們不指定變量的默認值時,這些變量的默認值是他們的零值,比如int類型的零值是0,string類型的零值是`""`,引用類型的零值是`nil`。 對于例子中的兩種類型的聲明,我們可以直接使用,對其進行賦值輸出。但是如果我們換成指針類型呢? > test1.go ```go package main import ( "fmt" ) func main() { var i *int *i=10 fmt.Println(*i) } ``` ```bash $ go run test1.go panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x4849df] goroutine 1 [running]: main.main() /home/itheima/go/src/golang_deeper/make_new/t ``` 從這個提示中可以看出,對于引用類型的變量,我們不光要聲明它,還要為它分配內容空間,否則我們的值放在哪里去呢?這就是上面錯誤提示的原因。 對于值類型的聲明不需要,是因為已經默認幫我們分配好了。 要分配內存,就引出來今天的`new`和`make`。 ### 三、new 對于上面的問題我們如何解決呢?既然我們知道了沒有為其分配內存,那么我們使用new分配一個吧。 ```go func main() { var i *int i=new(int) *i=10 fmt.Println(*i) } ``` 現在再運行程序,完美PASS,打印10。現在讓我們看下new這個內置的函數。 ```go // 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函數這種內存置為零的好處,我們再看一個例子。 > test2.go ```go package main import ( "fmt" "sync" ) type user struct { lock sync.Mutex name string age int } func main() { u := new(user) //默認給u分配到內存全部為0 u.lock.Lock() //可以直接使用,因為lock為0,是開鎖狀態 u.name = "張三" u.lock.Unlock() fmt.Println(u) } ``` 運行 ```bash $ go run test2.go &{{0 0} 張三 0} ``` 示例中的user類型中的lock字段我不用初始化,直接可以拿來用,不會有無效內存引用異常,因為它已經被零值了。 這就是new,它返回的永遠是類型的指針,指向分配類型的內存地址。 ### 四、make make也是用于內存分配的,但是和new不同。 它只用于 * chan * map * slice 的內存創建,而且它返回的類型就是這三個類型本身,而不是他們的指針類型,因為這三種類型就是引用類型,所以就沒有必要返回他們的指針了。 注意,因為這三種類型是引用類型,所以必須得初始化,但是不是置為零值,這個和new是不一樣的。 ```go func make(t Type, size ...IntegerType) Type ``` 從函數聲明中可以看到,返回的還是該類型。 ### 五、make與new的異同 相同 * 堆空間分配 不同 make: 只用于slice、map以及channel的初始化, 無可替代 new: 用于類型內存分配(初始化值為0), 不常用 > new不常用 > > 所以有new這個內置函數,可以給我們分配一塊內存讓我們使用,但是現實的編碼中,它是不常用的。我們通常都是采用短語句聲明以及結構體的字面量達到我們的目的,比如: > > ```go > i : =0 > u := user{} > ``` > make 無可替代 > > 我們在使用slice、map以及channel的時候,還是要使用make進行初始化,然后才才可以對他們進行操作。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看