Go語言學(xué)習(xí)之new函數(shù)的用法詳解
1、new函數(shù)介紹
在 Go 語言中,new 函數(shù)用于動(dòng)態(tài)地分配內(nèi)存,返回一個(gè)指向新分配的零值的指針。它的語法如下:
func new(Type) *Type
其中,Type 表示要分配的內(nèi)存的類型,new 函數(shù)返回一個(gè)指向 Type 類型的新分配的零值的指針。但是需要注意的是,new 函數(shù)只分配內(nèi)存,并返回指向新分配的零值的指針,而不會(huì)初始化該內(nèi)存。
所謂零值,是指 Go 語言中變量在聲明時(shí)自動(dòng)賦予的默認(rèn)值。對(duì)于基本類型來說,它們的零值如下:
- 布爾型:false
- 整型:0
- 浮點(diǎn)型:0.0
- 復(fù)數(shù)型:0 + 0i
- 字符串:""(空字符串)
- 指針:nil
- 接口:nil
- 切片、映射和通道:nil
因此,new 函數(shù)返回的指針指向新分配的零值,但不會(huì)將其初始化為非零值。如果需要將內(nèi)存初始化為非零值,可以使用結(jié)構(gòu)體字面量或者顯式地為其賦值。
2、示例
(1)示例 1:
package main import ( "fmt" ) func main() { var p *int p = new(int) fmt.Println(*p) //0 }
上面的代碼首先聲明了一個(gè)指向整數(shù)的指針 p,然后使用 new 函數(shù)分配了一個(gè)新的整數(shù),將其地址賦給 p。由于 new 函數(shù)返回的指針指向新分配的零值,因此 p 的值為 0。
(2)示例 2:
在實(shí)際編程中,new 函數(shù)通常與結(jié)構(gòu)體類型一起使用,以便為結(jié)構(gòu)體動(dòng)態(tài)地分配內(nèi)存。例如,以下代碼定義了一個(gè)名為 Person 的結(jié)構(gòu)體類型,并使用 new 函數(shù)為其分配內(nèi)存:
package main import "fmt" type Person struct { name string age int sex int } func main() { // 使用 new 函數(shù)分配內(nèi)存,但不會(huì)將其初始化為非零值 p := new(Person) fmt.Println(p) // 輸出:&{ 0 0} // 使用結(jié)構(gòu)體字面量初始化 p2 := &Person{name: "Tom", age: 18, sex: 1} fmt.Println(p2) // 輸出:&{Tom 18 1} // 顯式為字段賦值 p3 := new(Person) p3.name = "Jerry" p3.age = 20 p3.sex = 0 fmt.Println(p3) // 輸出:&{Jerry 20 0} }
上面的代碼中,使用 new 函數(shù)分配了一個(gè)新的 Person 結(jié)構(gòu)體,但不會(huì)將其初始化為非零值,因此輸出結(jié)果是"空字符串 0 0"。接下來,使用結(jié)構(gòu)體字面量或者顯式為其賦值,將其初始化為非零值。
注意 1:p3 := new(Person) 返回是指向新分配的Person類型對(duì)象零值的指針,按照我們對(duì)指針語法的了解,基于p3顯示賦值的話需要使用如下語法進(jìn)行賦值:
(*p3).name = "Jerry" (*p3).age = 20 (*p3).sex = 0
而我們?cè)趯?duì)指針類型結(jié)構(gòu)體對(duì)象賦值的時(shí)候一般都很少會(huì)帶著*,這是Go指針語法糖為我們做的簡(jiǎn)化?!?/p>
3、總結(jié)
表達(dá)式new(T)將創(chuàng)建一個(gè)T類型的匿名變量,所做的是為T類型的新值分配并清零一塊內(nèi)存空間,然后將這塊內(nèi)存空間的地址作為結(jié)果返回,而這個(gè)結(jié)果就是指向這個(gè)新的T類型值的指針值,返回的指針類型為*T。
new創(chuàng)建的內(nèi)存空間位于heap上,空間的默認(rèn)值為數(shù)據(jù)類型默認(rèn)值。如:new(int) 則 *p為0,new(bool) 則 *p為false。如果需要將內(nèi)存初始化為非零值,可以使用結(jié)構(gòu)體字面量或者顯式地為其賦值。
我們只需使用new()函數(shù),無需擔(dān)心其內(nèi)存的生命周期或怎樣將其刪除,因?yàn)镚o語言的內(nèi)存管理系統(tǒng)會(huì)幫我們打理一切。
到此這篇關(guān)于Go語言學(xué)習(xí)之new函數(shù)的用法詳解的文章就介紹到這了,更多相關(guān)Go語言new函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Golang如何監(jiān)聽某個(gè)函數(shù)的開始執(zhí)行和執(zhí)行結(jié)束
這篇文章主要為大家詳細(xì)介紹了Golang如何監(jiān)聽某個(gè)函數(shù)的開始執(zhí)行和執(zhí)行結(jié)束,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下2024-02-02go-micro使用Consul做服務(wù)發(fā)現(xiàn)的方法和原理解析
這篇文章主要介紹了go-micro使用Consul做服務(wù)發(fā)現(xiàn)的方法和原理,這里提供一個(gè)通過docker快速安裝Consul的方式,當(dāng)然前提是你得安裝了docker,需要的朋友可以參考下2022-04-04Win10系統(tǒng)下Golang環(huán)境搭建全過程
在編程語言的選取上,越來越多的人選擇了Golang,下面這篇文章主要給大家介紹了關(guān)于Win10系統(tǒng)下Golang環(huán)境搭建的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01go語言定時(shí)器Timer及Ticker的功能使用示例詳解
這篇文章主要為大家介紹了go語言定時(shí)器的功能使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04攔截信號(hào)Golang應(yīng)用優(yōu)雅關(guān)閉的操作方法
這篇文章主要介紹了攔截信號(hào)優(yōu)雅關(guān)閉Golang應(yīng)用,本文介紹了信號(hào)的概念及常用信號(hào),并給出了應(yīng)用廣泛的幾個(gè)示例,例如優(yōu)雅地關(guān)閉應(yīng)用服務(wù)、在命令行應(yīng)用中接收終止命令,需要的朋友可以參考下2023-02-02基于GORM實(shí)現(xiàn)CreateOrUpdate方法詳解
這篇文章主要為大家介紹了基于GORM實(shí)現(xiàn)CreateOrUpdate方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10夯實(shí)Golang基礎(chǔ)之?dāng)?shù)據(jù)類型梳理匯總
這篇文章主要8為大家介紹了夯實(shí)Golang基礎(chǔ)之?dāng)?shù)據(jù)類型梳理匯總,有需要的朋友可以借鑒參考下,希望能夠有所幫助2023-10-10golang中strconv.ParseInt函數(shù)用法示例
這篇文章主要介紹了golang中strconv.ParseInt函數(shù)用法,實(shí)例分析了strconv.ParseInt函數(shù)將字符串轉(zhuǎn)換為數(shù)字的簡(jiǎn)單使用方法,需要的朋友可以參考下2016-07-07詳解Go多協(xié)程并發(fā)環(huán)境下的錯(cuò)誤處理
這篇文章主要介紹了詳解Go多協(xié)程并發(fā)環(huán)境下的錯(cuò)誤處理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08