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

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

揭秘 Go 中的 new() 和 make() 函數

來源: 責編: 時間:2023-10-24 09:00:36 335觀看
導讀Go(或 Golang)是一種現代、靜態類型、編譯型的編程語言,專為構建可擴展、并發和高效的軟件而設計。它提供了各種內置的函數和特性,幫助開發人員編寫簡潔高效的代碼。其中包括 new() 和 make() 函數,這兩個函數乍看起來可能

Go(或 Golang)是一種現代、靜態類型、編譯型的編程語言,專為構建可擴展、并發和高效的軟件而設計。它提供了各種內置的函數和特性,幫助開發人員編寫簡潔高效的代碼。其中包括 new() 和 make() 函數,這兩個函數乍看起來可能相似,但在 Go 中用于不同的目的,對于內存分配和數據初始化至關重要。jHk28資訊網——每日最新資訊28at.com

在本博客文章中,我們將探討 new() 和 make() 函數之間的區別,了解何時以及如何有效地使用它們。jHk28資訊網——每日最新資訊28at.com

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

new() 和 make() 函數

new() 和 make() 都是 Go 中的內置函數,用于分配內存。然而,它們用于不同的數據類型和場景:jHk28資訊網——每日最新資訊28at.com

new() 函數:jHk28資訊網——每日最新資訊28at.com

  • new() 用于為值類型(例如整數、浮點數、結構體)分配內存,并返回指向新分配的零值的指針。
  • 它接受一個參數,即類型,并返回該類型的指針。

make() 函數:jHk28資訊網——每日最新資訊28at.com

  • make() 用于創建和初始化切片、映射和通道,這些都是 Go 中的引用類型。
  • 它根據類型的不同接受兩個或三個參數,并返回一個已初始化(非零值)的值,可以立即使用。

理解 new() 函數

new() 函數的語法非常簡單,如下所示:jHk28資訊網——每日最新資訊28at.com

func new(Type) *Type

這里的 Type 表示我們想要為其分配內存的值的類型。讓我們看一個如何使用 new() 的示例。jHk28資訊網——每日最新資訊28at.com

在這個示例中,我們使用 new() 創建了 Person 結構體的一個新實例,然后使用指針分配值給其字段。jHk28資訊網——每日最新資訊28at.com

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)}

這個程序將產生如下所示的輸出。jHk28資訊網——每日最新資訊28at.com

> go run main.go*main.PersonName: AliceAge: 30

理解 make() 函數

make() 函數的語法取決于它所用于的類型。jHk28資訊網——每日最新資訊28at.com

(1) 對于切片(Slices)jHk28資訊網——每日最新資訊28at.com

func make([]Type, len, cap) []Type
  • Type:切片將保存的元素類型。
  • len:切片的初始長度。
  • cap:切片的容量,這是可選的,并用于指定底層數組的容量。如果未提供,它默認與長度相同。

使用 make() 創建切片的示例:jHk28資訊網——每日最新資訊28at.com

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)}

此程序將產生如下輸出:jHk28資訊網——每日最新資訊28at.com

> go run main.goLength: 5Capacity: 10Values: [0 0 0 0 0]Length: 5Capacity: 5Values: [0 0 0 0 0]

(2) 對于映射(Maps)jHk28資訊網——每日最新資訊28at.com

func make(map[KeyType]ValueType, initialCapacity int) map[KeyType]ValueType
  • KeyType:映射中鍵的類型。
  • ValueType:與鍵關聯的值的類型。
  • initialCapacity:映射的初始容量。這是可選的,但當預先知道元素數量時,可以用于優化性能。

使用 make() 創建映射的示例:jHk28資訊網——每日最新資訊28at.com

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)jHk28資訊網——每日最新資訊28at.com

func make(chan Type, capacity int) chan Type
  • Type:可以通過通道發送和接收的值的類型。
  • capacity:通道的緩沖區大小。如果設置為0,通道是無緩沖的。

使用 make() 創建通道的示例:jHk28資訊網——每日最新資訊28at.com

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() 函數的謎團,并解釋了它們的區別和用途。總結一下:jHk28資訊網——每日最新資訊28at.com

  • 使用 new() 為值類型分配內存,并獲取指向零值的指針。
  • 使用 make() 創建和初始化切片、映射和通道(引用類型),并指定它們的類型和初始容量。

理解 new() 和 make() 之間的區別對于在 Go 中進行高效的內存分配和數據初始化至關重要。正確使用這些函數將在您的 Golang 項目中產生更干凈和更優化的代碼。愿您編程愉快!jHk28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-14718-0.html揭秘 Go 中的 new() 和 make() 函數

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

上一篇: 一次搞定:借助Hutool封裝代碼快速解決webservice調用煩惱

下一篇: 五個不能錯過的VS Code插件

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 武川县| 陆丰市| 缙云县| 肥东县| 桃源县| 沙河市| 从江县| 金华市| 仙居县| 子长县| 高州市| 黄龙县| 彭水| 长阳| 武宣县| 柳河县| 从江县| 巴林右旗| 蒙阴县| 海口市| 攀枝花市| 通山县| 鸡西市| 大冶市| 北京市| 宁阳县| 华蓥市| 融水| 沧州市| 金门县| 攀枝花市| 济宁市| 拉萨市| 乌拉特后旗| 衡阳县| 潍坊市| 巴彦县| 澄城县| 英山县| 和静县| 合江县|