golang中的make與new


golang 中有兩個內存分配機制 :new和make,二者有明顯區別.

  new:new(T)分配了零值填充的T類型的內存空間,並且返回其地址,即一個*T類型的值。其自身是一個指針.可用於初始化任何類型

  make: 返回一個有初始值(非零)的T類型,而不是*T,其只能用來初始化:slice,map和channel三種類型。

對比:

  1. 適用范圍:make 只能創建內建類型(slice map channel), new 則是可以對所有類型進行內存分配
  2. 返回值: new 返回指針, make 返回引用
  3. 填充值: new 填充零值, make 填充非零值

代碼:

package main

import (
    "fmt"
    "reflect"
)

type Books struct {
    Title,
    Content,
    Author string
}

func main() {

    a := new([]int)
    fmt.Println(a)
    //輸出&[],a本身是一個地址
    b := make([]int, 1)
    fmt.Println(b)
    //輸出[0],b本身是一個slice對象,其內容默認為0

    book1 := new(Books)
    book1.Title = "this is book1 title"
    book1.Content = "this is book1 content"
    book1.Author = "this is book1 author"
    book2 := Books{"this is book2 title", "this is book2 content", "this is book2 author"}
    fmt.Println("book1:", book1, ",Type:", reflect.TypeOf(book1)) 
  //book1: &{this is book1 title this is book1 content this is book1 author} ,Type: *main.Books fmt.Println("book2:", book2, ",Type:", reflect.TypeOf(book2))
  //book2: {this is book2 title this is book2 content this is book2 author} ,Type: main.Books }

 

指針和引用的區別:
  相同點:
    都是地址的概念
    指針指向一塊內存,它的內容是所指內存的地址;而引用則是某塊內存的別名。
  不同點:
    指針是一個實體,而引用僅是個別名
    引用只能在定義時被初始化一次,之后不可變;指針可變;引用“從一而終”,指針可以“見異思遷”;
    引用是類型安全的,而指針不是 (引用比指針多了類型檢查
 
指針傳遞參數本質上是值傳遞的方式,它所傳遞的是一個地址值。值傳遞過程中,被調函數的形式參數作為被調函數的局部變量處理,即在棧中開辟了內存空間以存放由主調函數放進來的實參的值,從而成為了實參的一個副本。值傳遞的特點是 被調函數對形式參數的任何操作都是作為局部變量進行,不會影響主調函數的實參變量的值。(這里是在說實參指針本身的地址值不會變)
 
而在引用傳遞過程中,被調函數的形式參數雖然 也作為局部變量在棧中開辟了內存空間,但是這時存放的是由主調函數放進來的 實參變量的地址(int &a的形式)。被調函數對形參的任何操作都被處理成間接尋址,即通過棧中存放的地址訪問主調函數中的實參變量。正因為如此,被調函數對形參做的任何操作都影響了主調函數中的實參變量。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM