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

淺析Golang中make和new的用法區(qū)別

 更新時(shí)間:2024年02月03日 08:10:27   作者:夢(mèng)_魚  
在Go語言中,有兩個(gè)比較雷同的內(nèi)置函數(shù),分別是new和make方法,二者都可以用來分配內(nèi)存,那他們有什么區(qū)別呢?下面就跟隨小編一起來學(xué)習(xí)一下吧

相同點(diǎn)

都是內(nèi)建函數(shù),都是在堆上分配內(nèi)存,都需要傳遞類型參數(shù)

不同點(diǎn)

1.傳遞的參數(shù)不一樣

new函數(shù)只接收一個(gè)參數(shù),make函數(shù)可以接收一個(gè)以上的參數(shù)

package main

import "fmt"

func main() {
	// int類型0值的指針,返回的值是以0x開頭的16進(jìn)制整數(shù),參數(shù)個(gè)數(shù)為1
	intZeroValuePoint := new(int)
	fmt.Printf("%v\n", intZeroValuePoint)

	// 為slice分配內(nèi)存, 創(chuàng)建初始值問 [0 0 0 0 0] 的切片,參數(shù)個(gè)數(shù)為3,第三個(gè)參數(shù)是可選的
	intHasInitLenSlice := make([]int, 5, 10)
	fmt.Printf("%v\n", intHasInitLenSlice)
}

2.返回的參數(shù)類型不一樣

new函數(shù)返回對(duì)應(yīng)輸入?yún)?shù)類型的指針類型,make函數(shù)返回輸入?yún)?shù)類型

package main

import "fmt"

func main() {
	// int類型0值的指針,返回的值是以0x開頭的16進(jìn)制整數(shù)
	intZeroValuePoint := new(int)
	fmt.Printf("%T\n", intZeroValuePoint)		// 輸出 *int

	// 為slice分配內(nèi)存, 創(chuàng)建初始值問 [0 0 0 0 0] 的切片
	intHasInitLenSlice := make([]int, 5, 10)
	fmt.Printf("%T\n", intHasInitLenSlice)		// 輸出 []int
}

3.使用場(chǎng)景不一樣

new函數(shù)為類型分配類型對(duì)應(yīng)零值內(nèi)存并返回指針,make是為特定引用類型slice map chan 分配內(nèi)存

package main

import "fmt"

func main() {
	// int類型0值的指針,返回的值是以0x開頭的16進(jìn)制整數(shù)
	intZeroValuePoint := new(int)
	fmt.Printf("%T\n", intZeroValuePoint) // 輸出 *int

	// 為slice零值分配內(nèi)存,返回的值是以0x開頭的16進(jìn)制整數(shù)
	sliceZeroValuePoint := new([]int)
	fmt.Printf("%T: %v\n", sliceZeroValuePoint, sliceZeroValuePoint) // 輸出 *[]int &[]

	// 為slice分配內(nèi)存, 創(chuàng)建初始值問 [0 0 0 0 0] 的切片
	intHasInitLenSlice := make([]int, 5, 10)
	fmt.Printf("%T\n", intHasInitLenSlice) // 輸出 []int

	// 為map分配內(nèi)存
	mapValue := make(map[string]string, 10)
	fmt.Printf("%T\n", mapValue) // 輸出 map[string]string

	// 為chan類型分配內(nèi)存
	chanValue := make(chan int, 10)
	fmt.Printf("%T\n", chanValue)
}

總結(jié)

下面小編為大家總結(jié)了一下new和make函數(shù)的異同點(diǎn),希望對(duì)大家有所幫助

相同點(diǎn)

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

不同點(diǎn)

用途和適用類型:

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

使用方式和返回值:

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

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

相關(guān)文章

  • 淺談golang的json.Unmarshal的坑

    淺談golang的json.Unmarshal的坑

    本文主要介紹了淺談golang的json.Unmarshal的坑,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • golang中defer的關(guān)鍵特性示例詳解

    golang中defer的關(guān)鍵特性示例詳解

    defer是golang語言中的關(guān)鍵字,用于資源的釋放,會(huì)在函數(shù)返回之前進(jìn)行調(diào)用。下面這篇文章主要給大家介紹了關(guān)于golang中defer的關(guān)鍵特性,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-08-08
  • GO語言基礎(chǔ)入門第一個(gè)go程序解讀

    GO語言基礎(chǔ)入門第一個(gè)go程序解讀

    這篇文章主要為大家介紹了GO語言基礎(chǔ)入門的第一個(gè)go程序解讀,下面來帶大家進(jìn)入Go語言世界helloworld的大門吧,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • golang簡(jiǎn)單位運(yùn)算示例

    golang簡(jiǎn)單位運(yùn)算示例

    這篇文章主要介紹了golang簡(jiǎn)單位運(yùn)算,包括位移運(yùn)算、取反及位與位或等運(yùn)算,需要的朋友可以參考下
    2016-07-07
  • Golang技巧之重試機(jī)制詳解

    Golang技巧之重試機(jī)制詳解

    重試機(jī)制是一種在程序執(zhí)行過程中出現(xiàn)錯(cuò)誤后重新嘗試執(zhí)行程序的一種機(jī)制,可以減少程序運(yùn)行過程中出現(xiàn)的錯(cuò)誤,從而提高程序的可靠性,本文就來講講Golang中是如何實(shí)現(xiàn)重試機(jī)制的吧
    2023-05-05
  • go內(nèi)存緩存BigCache實(shí)現(xiàn)BytesQueue源碼解讀

    go內(nèi)存緩存BigCache實(shí)現(xiàn)BytesQueue源碼解讀

    這篇文章主要為大家介紹了go內(nèi)存緩存BigCache實(shí)現(xiàn)BytesQueue源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Golang中crypto/cipher加密標(biāo)準(zhǔn)庫全面指南

    Golang中crypto/cipher加密標(biāo)準(zhǔn)庫全面指南

    本文主要介紹了Golang中crypto/cipher加密標(biāo)準(zhǔn)庫,包括對(duì)稱加密、非對(duì)稱加密以及使用流加密和塊加密算法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • golang 語言中錯(cuò)誤處理機(jī)制

    golang 語言中錯(cuò)誤處理機(jī)制

    Golang 的錯(cuò)誤處理方式可能和這些你熟悉的語言有所不同,今天通過本文給大家分享golang 語言中錯(cuò)誤處理機(jī)制,感興趣的朋友一起看看吧
    2021-08-08
  • 詳解golang channel有無緩沖區(qū)的區(qū)別

    詳解golang channel有無緩沖區(qū)的區(qū)別

    這篇文章主要給大家介紹了golang channel有無緩沖區(qū)的區(qū)別,無緩沖是同步的,有緩沖是異步的,文中通過代碼示例給大家講解的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • 一文詳解Golang中字符串的常見錯(cuò)誤

    一文詳解Golang中字符串的常見錯(cuò)誤

    這篇文章主要來和大家深入討論一下Golang?中的字符串,并查看一些不同的場(chǎng)景,以避免常見錯(cuò)誤,對(duì)大家掌握golang有一定的幫助,需要的可以了解下
    2023-10-10

最新評(píng)論