成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

一、引言

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

二、new() 函數

  • new() 函數的基本語法及用法。
  • new() 創建的變量是指定類型的零值,并返回該變量的指針。
  • new() 適用于創建引用類型以外的其他類型變量。
package main

import "fmt"

func main() {
    // 使用 new() 創建一個 int 類型的零值變量的指針
    numPtr := new(int)

    fmt.Println(*numPtr) // 輸出 0
}

三、make() 函數

  • make() 函數的基本語法及用法。
  • make() 用于創建并初始化引用類型的變量。
  • make() 適用于創建切片、映射和通道等引用類型的變量。
  • make() 創建的變量不是零值,而是根據類型進行初始化。
package main

import "fmt"

func main() {
    // 使用 make() 創建一個切片,并初始化長度為 3 的切片
    slice := make([]int, 3)

    fmt.Println(slice) // 輸出 [0 0 0]
}

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

  • new() 用于創建任意類型的變量,而 make() 僅用于創建引用類型的變量。
  • new() 返回的是指針,而 make() 返回的是初始化后的值。
  • new() 創建的變量是零值,make() 創建的變量是根據類型進行初始化。
package main

import "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() 的底層實現原理略有不同。

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

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

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

package main

import (
 "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 類型,最后輸出指針的值。這個值就是我們所創建的變量的內存地址。

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

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

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

package main

import (
 "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 方法獲取切片的長度。這樣,我們就可以獲得切片的底層數組的指針和長度。

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

總結

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

責任編輯:趙寧寧 來源: 愛發白日夢的后端
相關推薦

2023-10-23 19:27:21

Go函數

2021-10-16 17:53:35

Go函數編程

2010-06-28 10:12:01

PHP匿名函數

2020-12-16 09:47:01

JavaScript箭頭函數開發

2022-10-08 07:49:55

New操作符函數

2021-04-20 23:25:16

執行函數變量

2022-11-07 18:12:54

Go語言函數

2022-10-24 00:03:26

GolangNew函數

2024-07-18 10:12:04

2019-11-05 10:03:08

callback回調函數javascript

2023-10-31 10:51:56

MySQLMVCC并發性

2019-08-19 12:50:00

Go垃圾回收前端

2025-01-13 13:00:00

Go網絡框架nbio

2023-10-08 08:53:36

數據庫MySQL算法

2014-06-23 10:42:56

iOS開發UIScrollVie

2016-08-31 15:50:50

PythonThreadLocal變量

2018-07-09 15:11:14

Java逃逸JVM

2023-03-24 08:01:27

Go語言內存

2010-06-01 15:25:27

JavaCLASSPATH

2016-12-08 15:36:59

HashMap數據結構hash函數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕日韩一区 | 亚洲视频在线观看免费 | 日本网站在线看 | 成人亚洲精品久久久久软件 | 米奇7777狠狠狠狠视频 | 久久99精品国产99久久6男男 | 很黄很污的网站 | 久久久久久国产一区二区三区 | 日日噜噜噜夜夜爽爽狠狠视频97 | 超碰人人做 | 91成人精品视频 | 国产一区二区三区四 | 一级黄色日本片 | 91精品国产91久久久久久最新 | 久久久久国产一区二区三区 | 国产精品亚洲综合 | 久久精品国产精品青草 | 国产高清在线观看 | 精品一区二区在线看 | 亚洲www | 国产男女视频网站 | 日韩精品一区二区三区视频播放 | 亚洲精品一区二区三区蜜桃久 | 亚洲精品视频一区 | 精品久久久久久久久久久久久久 | 黄色一级大片在线免费看产 | 国产成人精品久久 | 国产精品3区 | 中文字幕日韩欧美一区二区三区 | 国产欧美一区二区三区在线播放 | 久久在线 | 久久久久亚洲 | 欧美性生活视频 | 亚洲一区二区三区在线 | 欧美一区二区三区在线观看视频 | 一级片片 | 色综合一区二区三区 | 久久小视频| 国产成人免费视频网站高清观看视频 | 黄色一级电影在线观看 | 日韩有码在线观看 |