日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

深入理解 Go 中的 new() 和 make() 函數

來源: 責編: 時間:2023-10-27 17:21:45 282觀看
導讀在 Go 語言中,new() 和 make() 是兩個常用的函數,用于創建和初始化不同類型的變量。本文將深入探討 new() 和 make() 的區別、使用場景以及底層實現原理。一、引言Go 中的 new() 和 make() 函數是用于創建和初始化變量

在 Go 語言中,new() 和 make() 是兩個常用的函數,用于創建和初始化不同類型的變量。本文將深入探討 new() 和 make() 的區別、使用場景以及底層實現原理。Phq28資訊網——每日最新資訊28at.com

Phq28資訊網——每日最新資訊28at.com

一、引言

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

二、new() 函數

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

三、make() 函數

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

四、new() 和 make() 的區別

  • new() 用于創建任意類型的變量,而 make() 僅用于創建引用類型的變量。
  • new() 返回的是指針,而 make() 返回的是初始化后的值。
  • new() 創建的變量是零值,make() 創建的變量是根據類型進行初始化。
package mainimport "fmt"func main() {    // 使用 new() 創建一個結構體的指針    personPtr := new(Person)    personPtr.Name = "Alice"    personPtr.Age = 30    fmt.Println(personPtr) // 輸出 &{Alice 30}    // 使用 make() 創建一個映射,并初始化鍵值對    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() 的底層實現原理

在 Go 語言中,new() 和 make() 的底層實現原理略有不同。Phq28資訊網——每日最新資訊28at.com

1.new() 的底層實現原理

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

下面是 new() 函數的簡化版本的底層實現原理示例代碼:Phq28資訊網——每日最新資訊28at.com

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

在上述示例代碼中,我們使用了 unsafe 包中的 Pointer 和 uintptr 類型來操作指針。我們首先使用 new(int) 創建一個 int 類型的零值變量的指針 numPtr,然后通過 unsafe.Pointer 將指針轉換為 unsafe.Pointer 類型,再通過 uintptr 將 unsafe.Pointer 值轉換為 uintptr 類型,最后輸出指針的值。這個值就是我們所創建的變量的內存地址。Phq28資訊網——每日最新資訊28at.com

2.make() 的底層實現原理

  • make() 函數在底層使用了 Go 的 runtime.makeslice、runtime.makemap 和 runtime.makechan 函數。
  • runtime.makeslice 函數用于創建切片,它會分配一塊連續的內存空間,并返回切片結構體。
  • runtime.makemap 函數用于創建映射,它會分配一塊哈希表內存,并返回映射結構體。
  • runtime.makechan 函數用于創建通道,它會分配一塊通道內存,并返回通道結構體。

下面是 make() 函數的簡化版本的底層實現原理示例代碼:Phq28資訊網——每日最新資訊28at.com

package mainimport ( "fmt" "reflect" "unsafe")func main() { // 使用 make() 創建一個切片,并初始化長度為 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) 創建一個長度為 3 的切片 slice,然后通過 reflect.ValueOf 將切片轉換為 reflect.Value 類型,再通過 Elem 方法獲取切片的元素,并通過 UnsafeAddr 方法獲取切片的底層數組的指針,最后通過 Len 方法獲取切片的長度。這樣,我們就可以獲得切片的底層數組的指針和長度。Phq28資訊網——每日最新資訊28at.com

請注意,上述示例代碼中使用了 reflect 和 unsafe 包,這是為了演示 make() 的底層實現原理而引入的,實際開發中并不需要經常使用這些包。Phq28資訊網——每日最新資訊28at.com

總結

通過深入了解 new() 和 make() 函數的區別、使用場景以及底層實現原理,讀者可以更好地理解和運用這兩個函數,并完美解決掉面試官的問題,并在實際開發中做出準確的選擇。Phq28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-15456-0.html深入理解 Go 中的 new() 和 make() 函數

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 幾行代碼教你用代碼操作Word

下一篇: 徹底理解C語言中的指針

標簽:
  • 熱門焦點
  • JavaScript學習 -AES加密算法

    引言在當今數字化時代,前端應用程序扮演著重要角色,用戶的敏感數據經常在前端進行加密和解密操作。然而,這樣的操作在網絡傳輸和存儲中可能會受到惡意攻擊的威脅。為了確保數據
  • WebRTC.Net庫開發進階,教你實現屏幕共享和多路復用!

    WebRTC.Net庫:讓你的應用更親民友好,實現視頻通話無痛接入! 除了基本用法外,還有一些進階用法可以更好地利用該庫。自定義 STUN/TURN 服務器配置WebRTC.Net 默認使用 Google 的
  • 猿輔導與新東方的兩種“歸途”

    作者|卓心月 出品|零態LT(ID:LingTai_LT)如何成為一家偉大企業?答案一定是對“勢”的把握,這其中最關鍵的當屬對企業戰略的制定,且能夠站在未來看現在,即使這其中的
  • 消費結構調整丨巨頭低價博弈,拼多多還卷得動嗎?

    來源:征探財經作者:陳香羽隨著流量紅利的退潮,電商的存量博弈越來越明顯。曾經主攻中高端與品質的淘寶天貓、京東重拾“低價”口號。而過去與他們錯位競爭的拼多多,靠
  • 當家的盒馬,加速謀生

    來源 | 價值星球Planet作者 | 歸去來自己“當家”的盒馬,開始加速謀生了。據盒馬官微消息,盒馬計劃今年開放生鮮供應鏈,將其生鮮商品送往食堂。目前,盒馬在上海已經與
  • 重估百度丨大模型,能撐起百度的“今天”嗎?

    自象限原創 作者|程心 羅輯2023年之前,對于自己的“今天”,百度也很迷茫。“新業務到 2022 年底還是 0,希望 2023 年出來一個 1。”這是2022年底,李彥宏
  • iQOO Neo8 Pro即將開售:到手價3099元起 安卓性能最強旗艦

    5月23日,iQOO如期舉行了新品發布會,全新的iQOO Neo8系列也正式與大家見面,包含iQOO Neo8和iQOO Neo8 Pro兩個版本,其中標準版搭載高通驍龍8+,而Pro版更
  • 朋友圈可以修改可見范圍了 蘋果用戶可率先體驗

    近日,iOS用戶迎來微信8.0.27正式版更新,除了可更換二維碼背景外,還新增了多項實用功能。在新版微信中,朋友圈終于可以修改可見范圍,簡單來說就是已發布的朋友圈
  • 聯想小新Pad Pro 12.6將要推出,搭載高通驍龍 870 處理器

    聯想小新Pad Pro 12.6將于秋季新品會上推出,官方按照慣例直接在發布會前給出了機型的所有參數。聯想小新 Pad Pro 12.6 將搭載高通驍龍 870 處理器,重量為 5
Top 主站蜘蛛池模板: 凤山县| 邮箱| 关岭| 舞阳县| 陆川县| 莱芜市| 喀什市| 东平县| 龙州县| 无棣县| 临沧市| 长治市| 蒲江县| 衡阳县| 商河县| 贞丰县| 漳州市| 北辰区| 互助| 莒南县| 磴口县| 哈尔滨市| 马鞍山市| 玛多县| 青龙| 莆田市| 满洲里市| 永兴县| 海原县| 郑州市| 兴义市| 蓬莱市| 来安县| 阿勒泰市| 寿宁县| 涟源市| 阿拉善盟| 平远县| 鹰潭市| 宜春市| 公主岭市|