Go(或 Golang)是一種現(xiàn)代、靜態(tài)類型、編譯型的編程語言,專為構(gòu)建可擴(kuò)展、并發(fā)和高效的軟件而設(shè)計。它提供了各種內(nèi)置的函數(shù)和特性,幫助開發(fā)人員編寫簡潔高效的代碼。其中包括 new() 和 make() 函數(shù),這兩個函數(shù)乍看起來可能相似,但在 Go 中用于不同的目的,對于內(nèi)存分配和數(shù)據(jù)初始化至關(guān)重要。
在本博客文章中,我們將探討 new() 和 make() 函數(shù)之間的區(qū)別,了解何時以及如何有效地使用它們。
new() 和 make() 都是 Go 中的內(nèi)置函數(shù),用于分配內(nèi)存。然而,它們用于不同的數(shù)據(jù)類型和場景:
new() 函數(shù):
make() 函數(shù):
new() 函數(shù)的語法非常簡單,如下所示:
func new(Type) *Type
這里的 Type 表示我們想要為其分配內(nèi)存的值的類型。讓我們看一個如何使用 new() 的示例。
在這個示例中,我們使用 new() 創(chuàng)建了 Person 結(jié)構(gòu)體的一個新實(shí)例,然后使用指針分配值給其字段。
package mainimport "fmt"type Person struct { Name string Age int}func main() { // Using new() to allocate memory for a Person struct p := new(Person) fmt.Printf("%T/n", p) // Accessing struct fields using the pointer p.Name = "Alice" p.Age = 30 // Displaying the values fmt.Println("Name:", p.Name) fmt.Println("Age:", p.Age)}
這個程序?qū)a(chǎn)生如下所示的輸出。
> go run main.go*main.PersonName: AliceAge: 30
make() 函數(shù)的語法取決于它所用于的類型。
(1) 對于切片(Slices)
func make([]Type, len, cap) []Type
使用 make() 創(chuàng)建切片的示例:
package mainimport "fmt"func main() { // Using make() to create a slice of integers numbers := make([]int, 5, 10) // Displaying the slice's length, capacity, and values fmt.Println("Length:", len(numbers)) fmt.Println("Capacity:", cap(numbers)) fmt.Println("Values:", numbers) // Using make() to create a slice of integers numbersWithoutOptional := make([]int, 5) // Displaying the slice's length, capacity, and values fmt.Println("Length:", len(numbersWithoutOptional)) fmt.Println("Capacity:", cap(numbersWithoutOptional)) fmt.Println("Values:", numbersWithoutOptional)}
此程序?qū)a(chǎn)生如下輸出:
> go run main.goLength: 5Capacity: 10Values: [0 0 0 0 0]Length: 5Capacity: 5Values: [0 0 0 0 0]
(2) 對于映射(Maps)
func make(map[KeyType]ValueType, initialCapacity int) map[KeyType]ValueType
使用 make() 創(chuàng)建映射的示例:
package mainimport "fmt"func main() { // Using make() to create a map of string keys and int values scores := make(map[string]int) // Adding values to the map scores["Alice"] = 95 scores["Bob"] = 87 // Displaying the map fmt.Println("Scores:", scores)}> go run main.goScores: map[Alice:95 Bob:87]
(3) 對于通道(Channels)
func make(chan Type, capacity int) chan Type
使用 make() 創(chuàng)建通道的示例:
package mainimport ( "fmt" "time")func main() { // Using make() to create an unbuffered channel of integers ch := make(chan int) // Sending data into the channel using a goroutine go func() { for i := 1; i <= 5; i++ { ch <- i time.Sleep(time.Second) // Simulating some work before sending the next value } close(ch) }() // Receiving data from the channel for num := range ch { fmt.Println("Received:", num) }}> go run main.goReceived: 1Received: 2Received: 3Received: 4Received: 5
在本博客文章中,我們解開了 Go 中的 new() 和 make() 函數(shù)的謎團(tuán),并解釋了它們的區(qū)別和用途。總結(jié)一下:
理解 new() 和 make() 之間的區(qū)別對于在 Go 中進(jìn)行高效的內(nèi)存分配和數(shù)據(jù)初始化至關(guān)重要。正確使用這些函數(shù)將在您的 Golang 項(xiàng)目中產(chǎn)生更干凈和更優(yōu)化的代碼。愿您編程愉快!
本文鏈接:http://www.www897cc.com/showinfo-26-14721-0.html揭秘 Go 中的 new() 和 make() 函數(shù)
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 一次搞定:借助Hutool封裝代碼快速解決webservice調(diào)用煩惱
下一篇: Java21新特性——虛擬線程