最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入講解Go語言中函數(shù)new與make的使用和區(qū)別

 更新時間:2017年10月25日 09:45:22   作者:飛雪無情  
大家都知道Go語言中的函數(shù)new與函數(shù)make一直是新手比較容易混淆的東西,看著相似,但其實不同,不過解釋兩者之間的不同也非常容易,下面這篇文章主要給大家介紹了關(guān)于Go語言中函數(shù)new與make區(qū)別的相關(guān)資料,需要的朋友可以參考下。

前言

本文主要給大家介紹了Go語言中函數(shù)new與make的使用和區(qū)別,關(guān)于Go語言中new和make是內(nèi)建的兩個函數(shù),主要用來創(chuàng)建分配類型內(nèi)存。在我們定義生成變量的時候,可能會覺得有點迷惑,其實他們的規(guī)則很簡單,下面我們就通過一些示例說明他們的區(qū)別和使用,話不多說了,來一起看看詳細的介紹吧。

變量的聲明

var i int
var s string

變量的聲明我們可以通過var關(guān)鍵字,然后就可以在程序中使用。當我們不指定變量的默認值時,這些變量的默認值是他們的零值,比如int類型的零值是0,string類型的零值是"",引用類型的零值是nil。

對于例子中的兩種類型的聲明,我們可以直接使用,對其進行賦值輸出。但是如果我們換成引用類型呢?

package main
import (
 "fmt"
)
func main() {
 var i *int
 *i=10
 fmt.Println(*i)
}

這個例子會打印出什么?0還是10?。以上全錯,運行的時候會painc,原因如下:

panic: runtime error: invalid memory address or nil pointer dereference

從這個提示中可以看出,對于引用類型的變量,我們不光要聲明它,還要為它分配內(nèi)容空間,否則我們的值放在哪里去呢?這就是上面錯誤提示的原因。

對于值類型的聲明不需要,是因為已經(jīng)默認幫我們分配好了。

要分配內(nèi)存,就引出來今天的new和make。

new

對于上面的問題我們?nèi)绾谓鉀Q呢?既然我們知道了沒有為其分配內(nèi)存,那么我們使用new分配一個吧。

func main() {
 var i *int
 i=new(int)
 *i=10
 fmt.Println(*i)
}

現(xiàn)在再運行程序,完美PASS,打印10?,F(xiàn)在讓我們看下new這個內(nèi)置的函數(shù)。

// The new built-in function allocates memory. The first argument is a type,
// not a value, and the value returned is a pointer to a newly
// allocated zero value of that type.
func new(Type) *Type

它只接受一個參數(shù),這個參數(shù)是一個類型,分配好內(nèi)存后,返回一個指向該類型內(nèi)存地址的指針。同時請注意它同時把分配的內(nèi)存置為零,也就是類型的零值。

我們的例子中,如果沒有*i=10,那么打印的就是0。這里體現(xiàn)不出來new函數(shù)這種內(nèi)存置為零的好處,我們再看一個例子。

func main() {
 u:=new(user)
 u.lock.Lock()
 u.name = "張三"
 u.lock.Unlock()
 fmt.Println(u)
}
type user struct {
 lock sync.Mutex
 name string
 age int
}

示例中的user類型中的lock字段我不用初始化,直接可以拿來用,不會有無效內(nèi)存引用異常,因為它已經(jīng)被零值了。

這就是new,它返回的永遠是類型的指針,指向分配類型的內(nèi)存地址。

make

make也是用于內(nèi)存分配的,但是和new不同,它只用于chan、map以及切片的內(nèi)存創(chuàng)建,而且它返回的類型就是這三個類型本身,而不是他們的指針類型,因為這三種類型就是引用類型,所以就沒有必要返回他們的指針了。

注意,因為這三種類型是引用類型,所以必須得初始化,但是不是置為零值,這個和new是不一樣的。

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

從函數(shù)聲明中可以看到,返回的還是該類型。

二者異同

所以從這里可以看的很明白了,二者都是內(nèi)存的分配(堆上),但是make只用于slice、map以及channel的初始化(非零值);而new用于類型的內(nèi)存分配,并且內(nèi)存置為零。所以在我們編寫程序的時候,就可以根據(jù)自己的需要很好的選擇了。

make返回的還是這三個引用類型本身;而new返回的是指向類型的指針。

其實new不常用

所以有new這個內(nèi)置函數(shù),可以給我們分配一塊內(nèi)存讓我們使用,但是現(xiàn)實的編碼中,它是不常用的。我們通常都是采用短語句聲明以及結(jié)構(gòu)體的字面量達到我們的目的,比如:

i:=0
u:=user{}

這樣更簡潔方便,而且不會涉及到指針這種比麻煩的操作。

make函數(shù)是無可替代的,我們在使用slice、map以及channel的時候,還是要使用make進行初始化,然后才才可以對他們進行操作。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 如何理解Go函數(shù)是一等公民原理及使用場景

    如何理解Go函數(shù)是一等公民原理及使用場景

    這篇文章主要為大家介紹了如何理解Go函數(shù)是一等公民及使用場景詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Go?的入口函數(shù)和包初始化的使用

    Go?的入口函數(shù)和包初始化的使用

    本文主要介紹了Go?的入口函數(shù)和包初始化的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 詳解Golang中g(shù)omock的使用場景和方法

    詳解Golang中g(shù)omock的使用場景和方法

    gomock是Go編程語言的模擬框架, 它與Go的內(nèi)置測試包很好地集成在一起,但也可以在其他上下文中使用,本文主要介紹了gomock的使用場景和方法,感興趣的可以了解下
    2024-10-10
  • Go語言的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)JSON

    Go語言的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)JSON

    本文主要介紹了Go語言的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)JSON,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 深入探究Go語言從反射到元編程的實踐與探討

    深入探究Go語言從反射到元編程的實踐與探討

    反射和元編程是一些高級編程概念,它們使開發(fā)者能夠在運行時檢查、修改并控制程序的行為,了解反射和元編程的工作方式可以幫助我們更好地理解Go,以及如何在需要的時候高效地使用它們,文章中介紹的非常詳細,感興趣的同學(xué)可以參考下
    2023-05-05
  • 深入了解Golang官方container/list原理

    深入了解Golang官方container/list原理

    在?Golang?的標準庫?container?中,包含了幾種常見的數(shù)據(jù)結(jié)構(gòu)的實現(xiàn),其實是非常好的學(xué)習(xí)材料,本文主要為大家介紹了container/list的原理與使用,感興趣的可以了解一下
    2023-08-08
  • Golang詳細講解常用Http庫及Gin框架的應(yīng)用

    Golang詳細講解常用Http庫及Gin框架的應(yīng)用

    下面這篇文章主要給大家介紹了關(guān)于Golang常用的Http庫及Gin框架,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • golang API開發(fā)過程的中的自動重啟方式(基于gin框架)

    golang API開發(fā)過程的中的自動重啟方式(基于gin框架)

    這篇文章主要介紹了golang API開發(fā)過程的中的自動重啟方式(基于gin框架),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Go語言中的自定義函數(shù)類型的實現(xiàn)

    Go語言中的自定義函數(shù)類型的實現(xiàn)

    在Go語言中,函數(shù)類型是一種將函數(shù)作為值的數(shù)據(jù)類型,本文主要介紹了Go語言中的自定義函數(shù)類型,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • GoLang中生成UUID唯一標識的實現(xiàn)

    GoLang中生成UUID唯一標識的實現(xiàn)

    這篇文章主要介紹了GoLang中生成UUID唯一標識的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05

最新評論

平潭县| 宜黄县| 靖西县| 枣强县| 德惠市| 宜兰县| 颍上县| 天镇县| 乐业县| 乌恰县| 嘉荫县| 青州市| 沁阳市| 江北区| 永丰县| 青神县| 宁陵县| 陆良县| 那曲县| 巍山| 社旗县| 内江市| 六枝特区| 额尔古纳市| 长治县| 余干县| 元阳县| 莱芜市| 靖西县| 皮山县| 福海县| 波密县| 工布江达县| 勐海县| 伊吾县| 万源市| 中山市| 郸城县| 娱乐| 科尔| 九龙城区|