成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 面試題: New 和 Make 是什么,差異在哪?

新聞
在 Go 語言中,有兩個比較雷同的內(nèi)置函數(shù),分別是 new 和 make 方法,其主要用途都是用于分配相應(yīng)類型的內(nèi)存空間。

[[385389]]

本文轉(zhuǎn)載自微信公眾號「腦子進煎魚了」,作者陳煎魚。轉(zhuǎn)載本文請聯(lián)系腦子進煎魚了公眾號。  

大家好,我是煎魚。

在 Go 語言中,有兩個比較雷同的內(nèi)置函數(shù),分別是 new 和 make 方法,其主要用途都是用于分配相應(yīng)類型的內(nèi)存空間。

看上去 new 和 make 都是分配內(nèi)存的,那他們有什么區(qū)別呢?這個細節(jié)點也成為了不少 Go 語言工程師的面試題之一,值得大家一看。

在這篇文章中我們將來解答這個問題。

基本特性

make

在 Go 語言中,內(nèi)置函數(shù) make 僅支持 slice、map、channel 三種數(shù)據(jù)類型的內(nèi)存創(chuàng)建,其返回值是所創(chuàng)建類型的本身,而不是新的指針引用。

函數(shù)簽名如下:

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

具體使用示例:

  1. func main() { 
  2.  v1 := make([]int, 1, 5) 
  3.  v2 := make(map[int]bool, 5) 
  4.  v3 := make(chan int, 1) 
  5.      
  6.  fmt.Println(v1, v2, v3) 

在代碼中,我們分別對三種類型調(diào)用了 make 函數(shù)進行了初始化。你會發(fā)現(xiàn)有的入?yún)⑹怯卸鄠€長度指定,有的沒有。

這塊的區(qū)別主要是長度(len)和容量(cap)的指定,有的類型是沒有容量這一說法,因此自然也就無法指定。

輸出結(jié)果:

  1. [0] map[] 0xc000044070 

有一個細節(jié)點要注意,調(diào)用 make 函數(shù)去初始化切片(slice)的類型時,會帶有零值,需要明確是否需要。

見過不少的小伙伴在這上面踩坑。

new

在 Go 語言中,內(nèi)置函數(shù) new 可以對類型進行內(nèi)存創(chuàng)建和初始化。其返回值是所創(chuàng)建類型的指針引用,與 make 函數(shù)在實質(zhì)細節(jié)上存在區(qū)別。

函數(shù)簽名如下:

  1. func new(Type) *Type 

具體使用示例:

  1. type T struct { 
  2.  Name string 
  3.  
  4. func main() { 
  5.  v := new(T) 
  6.  v.Name = "煎魚" 

從上面的例子的效果來看,是不是似曾相似?其實與下面這種方式的一樣的:

  1. func main() { 
  2.  v := T{} 
  3.  v.Name = "煎魚" 

輸出結(jié)果均是:

  1. &{Name:煎魚} 

其實 new 函數(shù)在日常工程代碼中是比較少見的,因為他可被替代。

一般會直接用快捷的 T{} 來進行初始化,因為常規(guī)的結(jié)構(gòu)體都會帶有結(jié)構(gòu)體的字面屬性:

  1. func NewT() *T { 
  2.  return &T{Name"煎魚"

這種初始化方式更方便。

區(qū)別在哪里

可能會有的小伙伴會疑惑一點,就是 new 函數(shù)也能初始化 make 的三種類型:

  1. v1 := new(chan bool) 
  2. v2 := new(map[string]struct{}) 

那 make 函數(shù)的區(qū)別,優(yōu)勢是什么呢?

本質(zhì)上在于 make 函數(shù)在初始化時,會初始化 slice、chan、map 類型的內(nèi)部數(shù)據(jù)結(jié)構(gòu),new 函數(shù)并不會。

例如:在 map 類型中,合理的長度(len)和容量(cap)可以提高效率和減少開銷。

更進一步的區(qū)別:

  • make 函數(shù):
    • 能夠分配并初始化類型所需的內(nèi)存空間和結(jié)構(gòu),返回引用類型的本身。
    • 具有使用范圍的局限性,僅支持 channel、map、slice 三種類型。
    • 具有獨特的優(yōu)勢,make 函數(shù)會對三種類型的內(nèi)部數(shù)據(jù)結(jié)構(gòu)(長度、容量等)賦值。
  • new 函數(shù):
    • 能夠分配類型所需的內(nèi)存空間,返回指針引用(指向內(nèi)存的指針)。
    • 可被替代,能夠通過字面值快速初始化。

總結(jié)

在這篇文章中,我們介紹了 Go 語言中 make 和 new 函數(shù)的使用,并針對其區(qū)別點進行了分析。

可能會有小伙伴疑惑,那 new 和 make 函數(shù)所初始化出來的內(nèi)存,是分配在堆還是棧上呢?

 

這就涉及到 Go 語言中的 “逃逸分析” 了(我公眾號前幾天的文章有發(fā)),如果所初始化的變量不需要在當前作用域外生存,那么理論上就不需要初始化在堆上。

 

責任編輯:武曉燕 來源: 腦子進煎魚了
相關(guān)推薦

2020-09-15 12:57:56

Golangnewmake

2023-07-14 08:12:21

計時器unsafecontext

2023-10-23 19:27:21

Go函數(shù)

2023-10-06 00:16:21

RedisMySQL事務(wù)

2023-03-24 08:01:27

Go語言內(nèi)存

2023-10-27 11:27:14

Go函數(shù)

2025-05-27 08:10:00

Go數(shù)組Map

2024-11-06 16:38:51

IO網(wǎng)絡(luò)

2020-06-04 14:40:40

面試題Vue前端

2010-01-21 10:10:40

CCIE RS 4.0

2010-02-22 10:40:53

CCIE RS 4.0

2023-07-28 08:04:56

StringHeaatomic線程

2024-09-24 13:49:13

SQL數(shù)據(jù)庫

2019-08-16 10:10:07

hashcodeequalsJava

2023-11-13 07:37:36

JS面試題線程

2011-03-24 13:27:37

SQL

2025-05-26 08:15:00

Go開發(fā)指針

2013-03-18 10:00:21

面試題程序員面試官

2021-03-12 13:57:13

零拷貝技術(shù)

2022-10-24 00:03:26

GolangNew函數(shù)
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 九色视频网站 | 亚洲视频 欧美视频 | 一级片在线观看 | 国产精品视频在线播放 | 日韩中文在线视频 | 东京av男人的天堂 | h在线免费观看 | 国产精品久久久久久久久久久免费看 | 日韩精品久久一区二区三区 | 午夜小视频在线播放 | 日韩三级电影在线看 | 亚洲一区二区免费 | 亚洲欧美日韩精品 | 男人的天堂在线视频 | 色综合九九 | 亚洲黄色一区二区三区 | 久久亚洲一区二区三区四区 | 99热在这里只有精品 | 操人网站 | 国产黄色在线观看 | www.色53色.com| 日本又色又爽又黄又高潮 | 亚洲精品无 | 国产99久久精品 | 欧美在线观看免费观看视频 | 国产亚洲精品久久情网 | 欧美性区 | 毛片站 | 久久人人爽人人爽人人片av免费 | 欧美久久不卡 | 欧美成年黄网站色视频 | 欧美视频在线一区 | 国产激情亚洲 | 久久爱综合 | 黄色成人在线观看 | 超碰91在线| h视频在线免费观看 | 国产精品自拍av | 国产精品毛片一区二区在线看 | 国产在线播 | 亚洲精品乱码久久久久久久久 |