日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Golang面試make和new的用法

在golang中,make和new都分配內(nèi)存,但是它們之間仍然存在一些差異。只有了解它們之間的差異,才能在適當(dāng)?shù)膱?chǎng)合使用它們。

為福田等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及福田網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、福田網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

簡(jiǎn)而言之,new只是分配內(nèi)存,而不初始化內(nèi)存;make分配并初始化內(nèi)存。所謂的初始化就是給一個(gè)類型賦一個(gè)初始值,例如,字符為空,整數(shù)為0,邏輯值為false。

從Golang的官方文檔的builtin(內(nèi)置的軟件包)中可以找到,make和new的用法。

官方文檔的內(nèi)置的軟件包

new的使用介紹:

我們先來看看new的定義

 
 
 
  1. // The new built-in function allocates memory. The first argument is a type,
  2. // not a value, and the value returned is a pointer to a newly
  3. // allocated zero value of that type.
  4. //內(nèi)建函數(shù)new分配內(nèi)存。其第一個(gè)實(shí)參為類型,而非值。其返回值為指向該類型的新分配的零值的指針。
  5. func new(Type) *Type

可以看出,它的參數(shù)是一個(gè)類型,返回值是指向該類型的內(nèi)存地址的指針,并且分配的內(nèi)存將被設(shè)置為零,即該類型的零值,即字符為空,整數(shù)為0,邏輯值為false

看一些例子

 
 
 
  1. type P struct {
  2.         Name string
  3.         Age  int
  4.     }   var a *[2]int
  5.     var s *string
  6.     var b *bool
  7.     var i *int
  8.     var ps *P
  9.     a = new([2]int)
  10.     s = new(string)
  11.     b = new(bool)
  12.     i = new(int)
  13.     ps = new(P) //structure
  14.     fmt.Println(a, " ", *a)
  15.     fmt.Println(s, " ", *s)
  16.     fmt.Println(b, " ", *b)
  17.     fmt.Println(i, " ", *i)
  18.     fmt.Println(ps, " ", *ps)

輸出如下:

 
 
 
  1. &[0 0]   [0 0]
  2. 0xc0000821e0   
  3. 0xc0000a409a   false
  4. 0xc0000a40b0   0
  5. &{ 0}   { 0}

上面基礎(chǔ)類型,我們看一下slice, map and channel類型是如何操作的:

 
 
 
  1. //map 操作
  2.    var mp *map[string]string
  3.    mp = new(map[string]string)
  4.     //注釋掉下面的行,new map 返回為nil,直接使用會(huì)panic
  5.    //*mp = make(map[string]string) // if this line is omitted, it will pan "Pan: assignment to entry in nil map"“
  6.    (*mp)["name"] = "lc"
  7.    fmt.Println((*mp)["name"])
  8.       // slice 操作    var ms *[]string
  9.    ms = new([]string)
  10.   // 注釋掉下面的行訪問的時(shí)候會(huì)下標(biāo)超出范圍    //*ms = make([]string,5) // if this line is deleted, it will "panic: runtime error: index out of range"
  11.    (*ms)[0] = "lc"
  12.    fmt.Println((*ms)[0]) 

從上面可以看出,silce,map,channel和其他類型是引用類型。當(dāng)引用類型初始化為nil時(shí),不能直接分配nil,也不能使用new來分配內(nèi)存,還需要使用make來進(jìn)行分配。

make的使用介紹:

我們看一下make的定義

 
 
 
  1. / /The make built-in function allocates and initializes an object of type
  2. // slice, map, or chan (only). Like new, the first argument is a type, not a
  3. // value. Unlike new, make's return type is the same as the type of its
  4. // argument, not a pointer to it. The specification of the result depends on
  5. // the type:
  6. //  Slice: The size specifies the length. The capacity of the slice is
  7. //  equal to its length. A second integer argument may be provided to
  8. //  specify a different capacity; it must be no smaller than the
  9. //  length. For example, make([]int, 0, 10) allocates an underlying array
  10. //  of size 10 and returns a slice of length 0 and capacity 10 that is
  11. //  backed by this underlying array.
  12. //  Map: An empty map is allocated with enough space to hold the
  13. //  specified number of elements. The size may be omitted, in which case
  14. //  a small starting size is allocated.
  15. //  Channel: The channel's buffer is initialized with the specified
  16. //  buffer capacity. If zero, or the size is omitted, the channel is
  17. //  unbuffered.
  18. //切片:size指定了其長(zhǎng)度。該切片的容量等于其長(zhǎng)度。切片支持第二個(gè)整數(shù)實(shí)參可用來指定不同的容量; 它必須不小于其長(zhǎng)度,因此 make([]int, 0, 10) 會(huì)分配一個(gè)長(zhǎng)度為0,容量為10的切片。
  19. //映射:初始分配的創(chuàng)建取決于size,但產(chǎn)生的映射長(zhǎng)度為0。size可以省略,這種情況下就會(huì)分配一個(gè)小的起始大小。
  20. //通道:通道的緩存根據(jù)指定的緩存容量初始化。若 size為零或被省略,該信道即為無緩存的。
  21. func make(t Type, size ...IntegerType) Type

可以看出,它返回的是類型本身而不是指針類型,因?yàn)閙ake只能為slice,map,channel等初始化內(nèi)存,并且它們返回引用類型,因此不必返回指針

讓我們看一些make的例子:

 
 
 
  1. mm :=make(map[string]string)
  2.   mm["name"] = "lc"
  3.   fmt.Println(mm["name"])
  4.   mss :=make([]int,2)
  5.   mss[0] = 100
  6.   fmt.Println(mss[0])
  7.   ch :=make(chan int,1)
  8.   ch <-100
  9.   fmt.Println(<-ch)

總結(jié):

make僅用于分配和初始化slice,map和chan類型的數(shù)據(jù)。new可以分配任何類型的數(shù)據(jù)。new分配返回一個(gè)指針,即Type * Type。make返回一個(gè)引用,該引用為Type由make分配的空間之后,清除并初始化由new分配的空間。


當(dāng)前標(biāo)題:Golang面試make和new的用法
URL鏈接:http://www.dlmjj.cn/article/cdpjgcc.html