在 Go 語言中,new() 和 make() 是兩個常用的函數(shù),用于創(chuàng)建和初始化不同類型的變量。本文將深入探討 new() 和 make() 的區(qū)別、使用場景以及底層實現(xiàn)原理。
package mainimport "fmt"func main() { // 使用 new() 創(chuàng)建一個 int 類型的零值變量的指針 numPtr := new(int) fmt.Println(*numPtr) // 輸出 0}
package mainimport "fmt"func main() { // 使用 make() 創(chuàng)建一個切片,并初始化長度為 3 的切片 slice := make([]int, 3) fmt.Println(slice) // 輸出 [0 0 0]}
package mainimport "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}
在 Go 語言中,new() 和 make() 的底層實現(xiàn)原理略有不同。
下面是 new() 函數(shù)的簡化版本的底層實現(xiàn)原理示例代碼:
package mainimport ( "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() 函數(shù)的簡化版本的底層實現(xiàn)原理示例代碼:
package mainimport ( "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)常使用這些包。
通過深入了解 new() 和 make() 函數(shù)的區(qū)別、使用場景以及底層實現(xiàn)原理,讀者可以更好地理解和運用這兩個函數(shù),并完美解決掉面試官的問題,并在實際開發(fā)中做出準確的選擇。
本文鏈接:http://www.tebozhan.com/showinfo-26-15456-0.html深入理解 Go 中的 new() 和 make() 函數(shù)
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 幾行代碼教你用代碼操作Word
下一篇: 徹底理解C語言中的指針