欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang中make與new使用區(qū)別小結(jié)

 更新時(shí)間:2024年01月28日 10:59:07   作者:過(guò)去日記  
Go語(yǔ)言中new和make是內(nèi)建的兩個(gè)函數(shù),主要用來(lái)創(chuàng)建分配類(lèi)型內(nèi)存,本文主要給大家介紹了Go語(yǔ)言中函數(shù)new與make的使用和區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下

前言

本文主要給大家介紹了Go語(yǔ)言中函數(shù)new與make的使用和區(qū)別,關(guān)于Go語(yǔ)言中new和make是內(nèi)建的兩個(gè)函數(shù),主要用來(lái)創(chuàng)建分配類(lèi)型內(nèi)存。在我們定義生成變量的時(shí)候,可能會(huì)覺(jué)得有點(diǎn)迷惑,不知道什么時(shí)候該使用make,什么時(shí)候該使用new,其實(shí)他們的規(guī)則很簡(jiǎn)單,下面我們就通過(guò)一些示例說(shuō)明他們的區(qū)別和使用。

變量的聲明

var i int
var s string

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

對(duì)于例子中的兩種類(lèi)型的聲明,我們可以直接使用,對(duì)其進(jìn)行賦值輸出。但是如果我們換成指針類(lèi)型呢?

test1.go

package main

import (
 "fmt"
)

func main() {
   var i *int
   *i=10
   fmt.Println(*i)
}
$ go run test1.go 
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x4849df]

goroutine 1 [running]:
main.main()
    /home/onenewcode/go/src/golang_deeper/make_new/t

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

對(duì)于值類(lèi)型的聲明不需要,是因?yàn)橐呀?jīng)默認(rèn)幫我們分配好了。

因?yàn)橐峙鋬?nèi)存,就引出來(lái)今天的內(nèi)存分配函數(shù)new和make。

new

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

func main() {

   var i *int
   i=new(int)
   *i=10
   fmt.Println(*i)

}

現(xiàn)在再運(yùn)行程序,完美PASS,打印10?,F(xiàn)在讓我們看下new這個(gè)內(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

把上面的英語(yǔ)翻譯可以得出以下信息:
它只接受一個(gè)參數(shù),這個(gè)參數(shù)是一個(gè)類(lèi)型,分配好內(nèi)存后,返回一個(gè)指向該類(lèi)型內(nèi)存地址的指針。同時(shí)請(qǐng)注意它同時(shí)把分配的內(nèi)存置為零,也就是類(lèi)型的零值。

我們的例子中,如果沒(méi)有*i=10,那么打印的就是0。這里體現(xiàn)不出來(lái)new函數(shù)這種內(nèi)存置為零的好處,我們?cè)倏匆粋€(gè)例子。

test2.go

package main

import (
    "fmt"
    "sync"
)

type user struct {
    lock sync.Mutex
    name string
    age int
}

func main() {

    u := new(user) //默認(rèn)給u分配到內(nèi)存全部為0

    u.lock.Lock()  //可以直接使用,因?yàn)閘ock為0,是開(kāi)鎖狀態(tài)
    u.name = "張三"
    u.lock.Unlock()

    fmt.Println(u)
}

運(yùn)行

$ go run test2.go 
&{{0 0} 張三 0}

示例中的user類(lèi)型中的lock字段我不用初始化,直接可以拿來(lái)用,不會(huì)有無(wú)效內(nèi)存引用異常,因?yàn)樗呀?jīng)被零值了。

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

make

make也是用于內(nèi)存分配的,但是和new不同。

它只用于,chan,map,slice的內(nèi)存創(chuàng)建,而且它返回的類(lèi)型就是這三個(gè)類(lèi)型本身,而不是他們的指針類(lèi)型,因?yàn)檫@三種類(lèi)型就是引用類(lèi)型,所以就沒(méi)有必要返回他們的指針了。

注意,因?yàn)檫@三種類(lèi)型是引用類(lèi)型,所以必須得初始化,但是不是置為零值,這個(gè)和new是不一樣的。

func make(t Type, size ...IntegerType) Type從函數(shù)聲明中可以看到,返回的還是該類(lèi)型。

make與new的異同

相同點(diǎn)

  • 都是內(nèi)建函數(shù),用于內(nèi)存管理。
  • 都涉及到動(dòng)態(tài)內(nèi)存的分配。

不同點(diǎn)

  • 用途和適用類(lèi)型:

    • new(T):適用于任何類(lèi)型的內(nèi)存分配,包括但不限于結(jié)構(gòu)體、數(shù)組、指針等。它會(huì)為指定的類(lèi)型 T 分配內(nèi)存,并將內(nèi)存初始化為其零值,然后返回指向該內(nèi)存區(qū)域的指針(類(lèi)型為 *T)。
    • make(T, args…):僅適用于三個(gè)內(nèi)建的引用類(lèi)型,即切片(slice)、映射(map)和通道(channel)。對(duì)于這三種類(lèi)型,make 不僅僅是分配內(nèi)存,還會(huì)執(zhí)行額外的初始化操作,如設(shè)置內(nèi)部數(shù)據(jù)結(jié)構(gòu)、哈希表大小以及 channel 緩沖區(qū)等。make 函數(shù)的返回值直接是初始化后的 slice/map/channel 類(lèi)型,而不是指針。
  • 使用方式和返回值:

    • new() 的調(diào)用形式相對(duì)簡(jiǎn)單:p := new(Type),返回的是一個(gè)指向新分配內(nèi)存的指針。
    • make() 的調(diào)用需要提供額外參數(shù)以初始化相應(yīng)的類(lèi)型,例如創(chuàng)建切片時(shí)需要長(zhǎng)度和可選的容量:s := make([]int, length, capacity);創(chuàng)建 map 或 channel 時(shí)無(wú)需指定大小,但可以對(duì)通道指定緩沖區(qū)大小。
  • 初始化內(nèi)容:

  • new() 只做最基本的內(nèi)存分配并填充零值。

  • make() 初始化的內(nèi)容更復(fù)雜,例如:

    • 對(duì)于切片,會(huì)創(chuàng)建底層數(shù)組并設(shè)置長(zhǎng)度和容量;
    • 對(duì)于映射,會(huì)初始化一個(gè)空的哈希表;
    • 對(duì)于通道,會(huì)創(chuàng)建一個(gè)通信的數(shù)據(jù)結(jié)構(gòu),并可選擇性地分配緩沖區(qū)。

總之,在 Go 語(yǔ)言中,當(dāng)你需要為自定義類(lèi)型或基本類(lèi)型分配內(nèi)存且不涉及特定初始化邏輯時(shí),使用 new();而當(dāng)你需要初始化 slice、map 或 channel 這些內(nèi)建的引用類(lèi)型時(shí),則必須使用 make()。

到此這篇關(guān)于Golang中make與new使用區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)Golang make與new內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Go+WebSocket實(shí)現(xiàn)實(shí)時(shí)通信功能

    基于Go+WebSocket實(shí)現(xiàn)實(shí)時(shí)通信功能

    在互聯(lián)網(wǎng)應(yīng)用程序中,實(shí)時(shí)通信是一種非常重要的功能,WebSocket 是一種基于 TCP 的協(xié)議,它允許客戶(hù)端和服務(wù)器之間進(jìn)行雙向通信,本文將介紹如何使用 Golang 創(chuàng)建單獨(dú)的 WebSocket 會(huì)話(huà),以實(shí)現(xiàn)實(shí)時(shí)通信功能,需要的朋友可以參考下
    2023-10-10
  • golang調(diào)試bug及性能監(jiān)控方式實(shí)踐總結(jié)

    golang調(diào)試bug及性能監(jiān)控方式實(shí)踐總結(jié)

    這篇文章主要為大家介紹了golang調(diào)試bug及性能監(jiān)控方式實(shí)踐是總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • golang協(xié)程與線(xiàn)程區(qū)別簡(jiǎn)要介紹

    golang協(xié)程與線(xiàn)程區(qū)別簡(jiǎn)要介紹

    這篇文章主要介紹了golang協(xié)程與線(xiàn)程區(qū)別簡(jiǎn)要介紹,進(jìn)程是操作系統(tǒng)資源分配的基本單位,是程序運(yùn)行的實(shí)例,線(xiàn)程是操作系統(tǒng)調(diào)度到CPU中執(zhí)行的基本單位
    2022-06-06
  • Golang科學(xué)計(jì)數(shù)法轉(zhuǎn)換string數(shù)字輸出的實(shí)現(xiàn)

    Golang科學(xué)計(jì)數(shù)法轉(zhuǎn)換string數(shù)字輸出的實(shí)現(xiàn)

    最近接手一個(gè)商城運(yùn)單號(hào)模塊,接手后發(fā)現(xiàn)有部分運(yùn)單號(hào)返回給前端是按照科學(xué)計(jì)數(shù)法的方式返回,本文就介紹一下Golang科學(xué)計(jì)數(shù)法轉(zhuǎn)換string數(shù)字輸出,感興趣的可以了解一下
    2021-07-07
  • Go語(yǔ)言庫(kù)系列之dotsql詳解

    Go語(yǔ)言庫(kù)系列之dotsql詳解

    這篇文章主要介紹了Go語(yǔ)言庫(kù)系列之dotsql的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 使用Golang搭建web服務(wù)的實(shí)現(xiàn)步驟

    使用Golang搭建web服務(wù)的實(shí)現(xiàn)步驟

    本文主要介紹了使用Golang搭建web服務(wù)的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Go標(biāo)準(zhǔn)庫(kù)之Requests的介紹與基本使用

    Go標(biāo)準(zhǔn)庫(kù)之Requests的介紹與基本使用

    Python中的Requests庫(kù)非常強(qiáng)大,所以Go開(kāi)發(fā)者模仿Python的Requests庫(kù),由此誕生了Grequests庫(kù),本文主要介紹了Requests的基本使用,有需要的可以參考下
    2024-04-04
  • GOLANG版的冒泡排序和快速排序分享

    GOLANG版的冒泡排序和快速排序分享

    這篇文章主要介紹了GOLANG版的冒泡排序和快速排序分享,需要的朋友可以參考下
    2015-03-03
  • go語(yǔ)言題解LeetCode1299將每個(gè)元素替換為右側(cè)最大元素

    go語(yǔ)言題解LeetCode1299將每個(gè)元素替換為右側(cè)最大元素

    這篇文章主要為大家介紹了go語(yǔ)言L(fǎng)eetCode刷題1299將每個(gè)元素替換為右側(cè)最大元素示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • GO?CountMinSketch計(jì)數(shù)器(布隆過(guò)濾器思想的近似計(jì)數(shù)器)

    GO?CountMinSketch計(jì)數(shù)器(布隆過(guò)濾器思想的近似計(jì)數(shù)器)

    這篇文章主要介紹了GO?CountMinSketch計(jì)數(shù)器(布隆過(guò)濾器思想的近似計(jì)數(shù)器),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-09-09

最新評(píng)論