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

Go中的new()和make()函數(shù)區(qū)別及底層原理詳解

 更新時間:2023年09月24日 15:26:20   作者:TimLiu  
這篇文章主要為大家介紹了Go中的new()和make()函數(shù)區(qū)別及底層原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

在 Go 語言中,new() 和 make() 是兩個常用的函數(shù),用于創(chuàng)建和初始化不同類型的變量。本文將深入探討 new() 和 make() 的區(qū)別、使用場景以及底層實現(xiàn)原理。

  • Go 中的 new() 和 make() 函數(shù)是用于創(chuàng)建和初始化變量的重要工具。
  • new() 用于創(chuàng)建指定類型的零值變量,并返回該變量的指針。
  • make() 用于創(chuàng)建并初始化引用類型的變量,如切片、映射和通道。

new() 函數(shù)

  • new() 函數(shù)的基本語法及用法。
  • new() 創(chuàng)建的變量是指定類型的零值,并返回該變量的指針。
  • new() 適用于創(chuàng)建引用類型以外的其他類型變量。
package main
import "fmt"
func main() {
    // 使用 new() 創(chuàng)建一個 int 類型的零值變量的指針
    numPtr := new(int)
    fmt.Println(*numPtr) // 輸出 0
}

make() 函數(shù)

  • make() 函數(shù)的基本語法及用法。
  • make() 用于創(chuàng)建并初始化引用類型的變量。
  • make() 適用于創(chuàng)建切片、映射和通道等引用類型的變量。
  • make() 創(chuàng)建的變量不是零值,而是根據(jù)類型進(jìn)行初始化。
package main
import "fmt"
func main() {
    // 使用 make() 創(chuàng)建一個切片,并初始化長度為 3 的切片
    slice := make([]int, 3)
    fmt.Println(slice) // 輸出 [0 0 0]
}

new() 和 make() 的區(qū)別

  • new() 用于創(chuàng)建任意類型的變量,而 make() 僅用于創(chuàng)建引用類型的變量。
  • new() 返回的是指針,而 make() 返回的是初始化后的值。
  • new() 創(chuàng)建的變量是零值,make() 創(chuàng)建的變量是根據(jù)類型進(jìn)行初始化。
package main
import "fmt"
func main() {
    // 使用 new() 創(chuàng)建一個結(jié)構(gòu)體的指針
    personPtr := new(Person)
    personPtr.Name = "Alice"
    personPtr.Age = 30
    fmt.Println(personPtr) // 輸出 &{Alice 30}
    // 使用 make() 創(chuàng)建一個映射,并初始化鍵值對
    m := make(map[string]int)
    m["one"] = 1
    m["two"] = 2
    fmt.Println(m) // 輸出 map[one:1 two:2]
}
type Person struct {
    Name string
    Age  int
}

new() 和 make() 的底層實現(xiàn)原理

在 Go 語言中,new() 和 make() 的底層實現(xiàn)原理略有不同。

new() 的底層實現(xiàn)原理

  • new() 函數(shù)在底層使用了 Go 的 runtime.newobject 函數(shù)。
  • runtime.newobject 函數(shù)會分配一塊內(nèi)存,大小為指定類型的大小,并將該內(nèi)存清零。
  • 然后,runtime.newobject 函數(shù)會返回這塊內(nèi)存的指針。

下面是 new() 函數(shù)的簡化版本的底層實現(xiàn)原理示例代碼:

package main
import (
    "fmt"
    "unsafe"
)
func main() {
    // 使用 new() 創(chuàng)建一個 int 類型的零值變量的指針
    numPtr := new(int)
    // 獲得指針的值
    ptrValue := uintptr(unsafe.Pointer(numPtr))
    // 輸出指針的值
    fmt.Println(ptrValue)
}

在上述示例代碼中,我們使用了 unsafe 包中的 Pointer 和 uintptr 類型來操作指針。我們首先使用 new(int) 創(chuàng)建一個 int 類型的零值變量的指針 numPtr,然后通過 unsafe.Pointer 將指針轉(zhuǎn)換為 unsafe.Pointer 類型,再通過 uintptr 將 unsafe.Pointer 值轉(zhuǎn)換為 uintptr 類型,最后輸出指針的值。這個值就是我們所創(chuàng)建的變量的內(nèi)存地址。

make() 的底層實現(xiàn)原理

  • make() 函數(shù)在底層使用了 Go 的 runtime.makeslice、runtime.makemap 和 runtime.makechan 函數(shù)。
  • runtime.makeslice 函數(shù)用于創(chuàng)建切片,它會分配一塊連續(xù)的內(nèi)存空間,并返回切片結(jié)構(gòu)體。
  • runtime.makemap 函數(shù)用于創(chuàng)建映射,它會分配一塊哈希表內(nèi)存,并返回映射結(jié)構(gòu)體。
  • runtime.makechan 函數(shù)用于創(chuàng)建通道,它會分配一塊通道內(nèi)存,并返回通道結(jié)構(gòu)體。

下面是 make() 函數(shù)的簡化版本的底層實現(xiàn)原理示例代碼:

package main
import (
    "fmt"
    "reflect"
    "unsafe"
)
func main() {
    // 使用 make() 創(chuàng)建一個切片,并初始化長度為 3 的切片
    slice := make([]int, 3)
    // 獲得切片的值和長度
    sliceValue := reflect.ValueOf(slice)
    sliceData := sliceValue.Elem().UnsafeAddr()
    sliceLen := sliceValue.Len()
    // 輸出切片的值和長度
    fmt.Println(sliceData, sliceLen)
}

在上述示例代碼中,我們使用了 reflect 包中的 Value、Elem 和 UnsafeAddr 方法來操作切片。我們首先使用 make([]int, 3) 創(chuàng)建一個長度為 3 的切片 slice,然后通過 reflect.ValueOf 將切片轉(zhuǎn)換為 reflect.Value 類型,再通過 Elem 方法獲取切片的元素,并通過 UnsafeAddr 方法獲取切片的底層數(shù)組的指針,最后通過 Len 方法獲取切片的長度。這樣,我們就可以獲得切片的底層數(shù)組的指針和長度。

請注意,上述示例代碼中使用了 reflect 和 unsafe 包,這是為了演示 make() 的底層實現(xiàn)原理而引入的,實際開發(fā)中并不需要經(jīng)常使用這些包。

總結(jié)

通過深入了解 new() 和 make() 函數(shù)的區(qū)別、使用場景以及底層實現(xiàn)原理,讀者可以更好地理解和運用這兩個函數(shù),并完美解決掉面試官的問題,并在實際開發(fā)中做出準(zhǔn)確的選擇。

以上就是Go中的new()和make()函數(shù)區(qū)別及底層原理詳解的詳細(xì)內(nèi)容,更多關(guān)于Go new make函數(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • golang并發(fā)編程使用Select語句的實現(xiàn)

    golang并發(fā)編程使用Select語句的實現(xiàn)

    Go語言中的select語句是并發(fā)編程中的重要工具,允許Goroutine等待多個通道操作,它阻塞直至任一case可執(zhí)行,可用于接收數(shù)據(jù)、實現(xiàn)超時機制和非阻塞通道操作,感興趣的可以了解一下
    2024-10-10
  • GO語言數(shù)組和切片實例詳解

    GO語言數(shù)組和切片實例詳解

    這篇文章主要介紹了GO語言數(shù)組和切片的用法,以實例形式較為詳細(xì)的分析了GO語言中數(shù)組與切片的創(chuàng)建及使用技巧,是深入學(xué)習(xí)GO語言的基礎(chǔ),需要的朋友可以參考下
    2014-12-12
  • 詳解如何使用Bazel構(gòu)建Golang程序

    詳解如何使用Bazel構(gòu)建Golang程序

    這篇文章主要為大家介紹了如何使用Bazel構(gòu)建Golang程序?qū)嵗斀?,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Go語言中如何通過方法為類型添加行為

    Go語言中如何通過方法為類型添加行為

    這篇文章主要介紹了Go語言中如何通過方法為類型添加行為的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Golang 之協(xié)程的用法講解

    Golang 之協(xié)程的用法講解

    這篇文章主要介紹了Golang 之協(xié)程的用法講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go開發(fā)Gin項目添加jwt功能實例詳解

    Go開發(fā)Gin項目添加jwt功能實例詳解

    這篇文章主要為大家介紹了Go開發(fā)Gin項目中添加jwt功能實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • golang中的單引號轉(zhuǎn)義問題

    golang中的單引號轉(zhuǎn)義問題

    這篇文章主要介紹了golang中的單引號轉(zhuǎn)義問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 詳解golang避免循環(huán)import問題(“import cycle not allowed”)

    詳解golang避免循環(huán)import問題(“import cycle not allowed”)

    這篇文章主要給大家介紹了關(guān)于golang中不允許循環(huán)import問題("import cycle not allowed")的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • Golang中的錯誤處理的示例詳解

    Golang中的錯誤處理的示例詳解

    這篇文章主要為大家詳細(xì)介紹了Golang中的錯誤處理的相關(guān)資料,文章中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Golang有一定幫助,需要的可以參考一下
    2022-12-12
  • GoLang context包的使用方法介紹

    GoLang context包的使用方法介紹

    日常Go開發(fā)中,Context包是用的最多的一個了,幾乎所有函數(shù)的第一個參數(shù)都是ctx,那么我們?yōu)槭裁匆獋鬟fContext呢,Context又有哪些用法,底層實現(xiàn)是如何呢?相信你也一定會有探索的欲望,那么就跟著本篇文章,一起來學(xué)習(xí)吧
    2023-03-03

最新評論

垣曲县| 蒙自县| 万源市| 耒阳市| 都昌县| 宁蒗| 牟定县| 西平县| 禄劝| 绩溪县| 白水县| 宿迁市| 安龙县| 凤山市| 哈尔滨市| 板桥市| 河间市| 辉县市| 咸阳市| 扎鲁特旗| 汕尾市| 湄潭县| 扎囊县| 隆回县| 壤塘县| 田阳县| 合川市| 青神县| 沁源县| 满洲里市| 长武县| 南平市| 巴青县| 会昌县| 阳城县| 乐昌市| 嘉善县| 和平区| 老河口市| 永泰县| 浏阳市|