自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

聊聊Golang的Make和New函數(shù)

開發(fā) 前端
對(duì)于int,string,float,rune,byte,bool等類型,在定義變量的時(shí)候系統(tǒng)已經(jīng)給申請(qǐng)了內(nèi)存,而且給了對(duì)應(yīng)的默認(rèn)值(int的默認(rèn)值為0,string的默認(rèn)值為"",bool的默認(rèn)值為false),所以我們可以直接給變量進(jìn)行賦值操作。

今天在聊make和new函數(shù)之前,咱們先來看一種現(xiàn)象 當(dāng)然如果你對(duì)golang的指針還不是很了解,可以先看看這篇文章,以做到無縫連接

??赐赀@個(gè),我徹底理解了golang的指針。

case1?

var a int
a = 1
fmt.Println(a)
//返回結(jié)果
//1

這個(gè)例子很簡(jiǎn)單,咱們定義了一個(gè)int類型的變量,然后賦值直接輸出,這個(gè)沒什么好疑問的,但是咱們把這個(gè)例子改一下

case2?

  var p *int
*p = 10
fmt.Println(*p)

請(qǐng)問上面代碼會(huì)輸出什么?不出意外會(huì)輸出10對(duì)不對(duì),但是咱們運(yùn)行之后,命令行卻輸出

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x2 addr=0x0 pc=0x10428df44]

goroutine 1 [running]:
main.main()

這是為什么呢?

簡(jiǎn)單說說原因:

圖片

因?yàn)槲覀冊(cè)趘ar p *int,只是把p變量定義為了指針類型,p的默認(rèn)值為nil,「并沒有在內(nèi)存上分配對(duì)應(yīng)的空間」,既然沒有空間,那給p變量賦值自然就會(huì)報(bào)錯(cuò),當(dāng)然p任然是占空間的,只不過p的值為nil

如果我們把代碼改成下面這樣:

 var p *int = new(int)
*p = 10
fmt.Println(*p)
//輸出結(jié)果
//10

結(jié)果就可以正常輸出,為什么加個(gè)new就可以正常輸出呢?想要回答這個(gè)問題,首先你得知道new函數(shù)做了什么。

圖片

new函數(shù)主要做了下面三件事

  • 調(diào)用操作系統(tǒng)接口申請(qǐng)一塊int類型的內(nèi)存空間
  • 操作系統(tǒng)將分配的空間返回給go程序
  • 在內(nèi)存中開辟了一塊int的空間,并且把該空間的指針指向p 因?yàn)楝F(xiàn)在指針p已經(jīng)指向了一塊被分配的空間,所以可以直接進(jìn)行賦值操作

小結(jié)?

對(duì)于int,string,float,rune,byte,bool等類型,在定義變量的時(shí)候系統(tǒng)已經(jīng)給申請(qǐng)了內(nèi)存,而且給了對(duì)應(yīng)的默認(rèn)值(int的默認(rèn)值為0,string的默認(rèn)值為"",bool的默認(rèn)值為false),所以我們可以直接給變量進(jìn)行賦值操作。

對(duì)于指針,切片,map等類型,這些變量直接定義的時(shí)候系統(tǒng)是沒有給分配內(nèi)存的,并且默認(rèn)值為nil,所以不能直接賦值。如果想賦值的話,需要用new或者make函數(shù)向系統(tǒng)提前申請(qǐng)內(nèi)存才行。

make和new的區(qū)別?

make和new都是用來內(nèi)存分配的方法,簡(jiǎn)單的說,new只分配內(nèi)存,

  • 「make用于slice,map,和channel的初始化,不僅可以開辟一個(gè)內(nèi)存,還能給這個(gè)內(nèi)存的類型初始化其零值」。
  • make返回的還是引用類型本身;而new返回的是指向類型的指針。

make

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

new

func new(Type) *Type

make只能用來分配及初始化類型為slice,map,channel的數(shù)據(jù);new可以分配任意類型的數(shù)據(jù)。

責(zé)任編輯:武曉燕 來源: 程序員小飯
相關(guān)推薦

2020-09-15 12:57:56

Golangnewmake

2023-10-23 19:27:21

Go函數(shù)

2023-10-27 11:27:14

Go函數(shù)

2023-03-24 08:01:27

Go語言內(nèi)存

2024-09-10 08:49:52

Go語言內(nèi)存

2023-03-10 15:45:03

Golang公平鎖

2023-11-06 09:21:39

表達(dá)式類型Cause

2021-03-05 08:51:00

Go語言make

2024-10-06 12:56:36

Golang策略設(shè)計(jì)模式

2023-01-26 00:59:39

B-Treegolang度量衡

2021-06-09 07:32:18

C++內(nèi)置函數(shù)函數(shù)傳參

2024-02-20 21:34:16

循環(huán)GolangGo

2023-11-29 07:47:29

Golang函數(shù)

2021-09-08 08:55:45

Javascript 高階函數(shù)前端

2022-03-30 09:01:37

CSS屬性函數(shù)

2021-05-28 08:52:45

Hive分析函數(shù)

2021-06-01 23:18:00

Golang語言Method

2023-11-01 16:55:27

Golang匿名函數(shù)

2022-10-17 08:22:28

2023-09-13 08:00:57

云原生Java開發(fā)者
點(diǎn)贊
收藏

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