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

聊聊Golang的Make和New函數

開發 前端
對于int,string,float,rune,byte,bool等類型,在定義變量的時候系統已經給申請了內存,而且給了對應的默認值(int的默認值為0,string的默認值為"",bool的默認值為false),所以我們可以直接給變量進行賦值操作。

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

。看完這個,我徹底理解了golang的指針。

case1?

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

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

case2?

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

請問上面代碼會輸出什么?不出意外會輸出10對不對,但是咱們運行之后,命令行卻輸出

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()

這是為什么呢?

簡單說說原因:

圖片

因為我們在var p *int,只是把p變量定義為了指針類型,p的默認值為nil,「并沒有在內存上分配對應的空間」,既然沒有空間,那給p變量賦值自然就會報錯,當然p任然是占空間的,只不過p的值為nil

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

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

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

圖片

new函數主要做了下面三件事

  • 調用操作系統接口申請一塊int類型的內存空間
  • 操作系統將分配的空間返回給go程序
  • 在內存中開辟了一塊int的空間,并且把該空間的指針指向p 因為現在指針p已經指向了一塊被分配的空間,所以可以直接進行賦值操作

小結?

對于int,string,float,rune,byte,bool等類型,在定義變量的時候系統已經給申請了內存,而且給了對應的默認值(int的默認值為0,string的默認值為"",bool的默認值為false),所以我們可以直接給變量進行賦值操作。

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

make和new的區別?

make和new都是用來內存分配的方法,簡單的說,new只分配內存,

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

make

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

new

func new(Type) *Type

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

責任編輯:武曉燕 來源: 程序員小飯
相關推薦

2020-09-15 12:57:56

Golangnewmake

2023-10-23 19:27:21

Go函數

2023-10-27 11:27:14

Go函數

2023-03-10 15:45:03

Golang公平鎖

2023-03-24 08:01:27

Go語言內存

2024-09-10 08:49:52

Go語言內存

2023-11-06 09:21:39

表達式類型Cause

2024-10-06 12:56:36

Golang策略設計模式

2023-01-26 00:59:39

B-Treegolang度量衡

2021-03-05 08:51:00

Go語言make

2021-06-09 07:32:18

C++內置函數函數傳參

2024-02-20 21:34:16

循環GolangGo

2021-05-28 08:52:45

Hive分析函數

2022-03-30 09:01:37

CSS屬性函數

2021-09-08 08:55:45

Javascript 高階函數前端

2023-11-29 07:47:29

Golang函數

2021-06-01 23:18:00

Golang語言Method

2023-11-01 16:55:27

Golang匿名函數

2022-10-17 08:22:28

2023-09-13 08:00:57

云原生Java開發者
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色综合久久久久 | 成人在线观 | 国产成人精品一区二区三区视频 | 男女啪啪高潮无遮挡免费动态 | 美日韩精品 | 亚洲午夜视频在线观看 | 欧美黄色免费网站 | 日本黄色免费大片 | 亚洲日本一区二区三区四区 | 日韩成人在线看 | 一道本不卡 | 欧美一级二级三级视频 | 久久久久久成人 | 91视频观看 | 久久99精品国产麻豆婷婷 | 成人av免费 | 亚洲国产精久久久久久久 | 日本视频在线播放 | 亚洲五码久久 | 亚洲精品在线看 | 欧美不卡视频一区发布 | 国产乱码一区 | 亚洲精品乱码8久久久久久日本 | 中文字幕乱码一区二区三区 | 午夜精品一区二区三区在线视频 | 亚洲欧美少妇 | 国产精品久久久久久吹潮 | 日韩美女一区二区三区在线观看 | 久久久久久久久久影视 | 日韩欧美在线一区 | 午夜激情影院 | 免费国产视频 | 欧美美乳 | 操操日 | 国产精品a免费一区久久电影 | 亚洲一区精品在线 | 国产精品欧美一区二区三区不卡 | 亚洲成人在线网 | 99re视频在线 | 正在播放国产精品 | 欧美精品在线播放 |