最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你揭秘Go中new()和make()函數(shù)的區(qū)別和用途

 更新時間:2023年10月11日 09:04:40   作者:技術(shù)的游戲  
Go(或 Golang)是一種現(xiàn)代、靜態(tài)類型、編譯型的編程語言,專為構(gòu)建可擴(kuò)展、并發(fā)和高效的軟件而設(shè)計,它提供了各種內(nèi)置的函數(shù)和特性,幫助開發(fā)人員編寫簡潔高效的代碼,在本博客文章中,我們將探討 new() 和 make() 函數(shù)之間的區(qū)別,了解何時以及如何有效地使用它們

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

new() 和 make() 都是 Go 中的內(nèi)置函數(shù),用于分配內(nèi)存。然而,它們用于不同的數(shù)據(jù)類型和場景:

new() 函數(shù):

  • new() 用于為值類型(例如整數(shù)、浮點(diǎn)數(shù)、結(jié)構(gòu)體)分配內(nèi)存,并返回指向新分配的零值的指針。
  • 它接受一個參數(shù),即類型,并返回該類型的指針。

make() 函數(shù):

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

理解 new() 函數(shù)

new() 函數(shù)的語法非常簡單,如下所示:

func new(Type) *Type

這里的 Type 表示我們想要為其分配內(nèi)存的值的類型。讓我們看一個如何使用 new() 的示例。

在這個示例中,我們使用 new() 創(chuàng)建了 Person 結(jié)構(gòu)體的一個新實例,然后使用指針分配值給其字段。

package main
import "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.Person
Name: Alice
Age: 30

理解 make() 函數(shù)

make() 函數(shù)的語法取決于它所用于的類型。

對于切片(Slices)

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

使用 make() 創(chuàng)建切片的示例:

package main
import "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.go
Length: 5
Capacity: 10
Values: [0 0 0 0 0]
Length: 5
Capacity: 5
Values: [0 0 0 0 0]

對于映射(Maps)

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

使用 make() 創(chuàng)建映射的示例:

package main
import "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.go
Scores: map[Alice:95 Bob:87]

對于通道(Channels)

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

使用 make() 創(chuàng)建通道的示例:

package main
import (
    "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.go
Received: 1
Received: 2
Received: 3
Received: 4
Received: 5

結(jié)論

在本博客文章中,我們解開了 Go 中的 new() 和 make() 函數(shù)的謎團(tuán),并解釋了它們的區(qū)別和用途??偨Y(jié)一下:

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

理解 new() 和 make() 之間的區(qū)別對于在 Go 中進(jìn)行高效的內(nèi)存分配和數(shù)據(jù)初始化至關(guān)重要。正確使用這些函數(shù)將在您的 Golang 項目中產(chǎn)生更干凈和更優(yōu)化的代碼。

以上就是一文帶你揭秘Go中new()和make()函數(shù)的區(qū)別和用途的詳細(xì)內(nèi)容,更多關(guān)于Go new()和make()函數(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • GoLang string與strings.Builder使用對比詳解

    GoLang string與strings.Builder使用對比詳解

    這篇文章主要介紹了GoLang string與strings.Builder使用對比,Builder 用于使用 Write 方法有效地構(gòu)建字符串。它最大限度地減少了內(nèi)存復(fù)制。零值可以使用了。不要復(fù)制非零生成器
    2023-03-03
  • Go語言copy()實現(xiàn)切片復(fù)制

    Go語言copy()實現(xiàn)切片復(fù)制

    本文主要介紹了Go語言copy()實現(xiàn)切片復(fù)制,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 詳解minio分布式文件存儲

    詳解minio分布式文件存儲

    MinIO 是一款基于 Go 語言的高性能、可擴(kuò)展、云原生支持、操作簡單、開源的分布式對象存儲產(chǎn)品,這篇文章主要介紹了minio分布式文件存儲,需要的朋友可以參考下
    2023-10-10
  • Go語言中的并發(fā)模式你了解了嗎

    Go語言中的并發(fā)模式你了解了嗎

    工作中查看項目代碼,發(fā)現(xiàn)會存在使用?GO?語言做并發(fā)的時候出現(xiàn)各種各樣的異常情況,實際上,出現(xiàn)上述的情況,還是因為我們對于?GO?語言的并發(fā)模型和涉及的?GO?語言基礎(chǔ)不夠扎實,所以本文小編就來帶大家深入了解下Go語言中的并發(fā)模式吧
    2023-08-08
  • 利用Go語言實現(xiàn)輕量級OpenLdap弱密碼檢測工具

    利用Go語言實現(xiàn)輕量級OpenLdap弱密碼檢測工具

    這篇文章主要為大家詳細(xì)介紹了如何利用Go語言實現(xiàn)輕量級OpenLdap弱密碼檢測工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下
    2022-09-09
  • Go語言的文件操作代碼匯總

    Go語言的文件操作代碼匯總

    本文給大家匯總介紹了go語言中的文件操作的代碼,包括文件的讀寫,文件的新建打開和刪除等,希望對大家學(xué)習(xí)go語言能夠有所幫助
    2018-10-10
  • Golang中println和fmt.Println區(qū)別解析

    Golang中println和fmt.Println區(qū)別解析

    Golang 中打印數(shù)據(jù)通常使用 fmt.Println() 方法,也可以使用內(nèi)置的 println() 方法。這兩個方法大家可能都使用過,它們的區(qū)別是什么呢?本文給大家詳細(xì)講解,感興趣的朋友跟隨小編一起看看吧
    2023-03-03
  • golang實現(xiàn)RPC模塊的示例

    golang實現(xiàn)RPC模塊的示例

    本文詳細(xì)介紹了在Go語言中如何實現(xiàn)RPC模塊,包括RPC服務(wù)端和客戶端的構(gòu)建及代碼實現(xiàn),同時提到了使用JSON-RPC的方法,通過簡單的步驟,可以實現(xiàn)跨進(jìn)程的遠(yuǎn)程過程調(diào)用,感興趣的可以了解一下
    2024-09-09
  • golang查看CPU使用率與內(nèi)存的方法詳解

    golang查看CPU使用率與內(nèi)存的方法詳解

    這篇文章主要給大家介紹了golang查看CPU使用率與內(nèi)存的方法,以及拓展介紹源碼里//go:指令,文中有詳細(xì)的代碼示例以及圖文介紹,需要的朋友可以參考下
    2023-10-10
  • Go項目中正確升級第三方依賴實戰(zhàn)指南(使用Go?Modules)

    Go項目中正確升級第三方依賴實戰(zhàn)指南(使用Go?Modules)

    這篇文章主要介紹了Go項目中使用Go?Modules正確升級第三方依賴的相關(guān)資料,Go Modules是Go語言官方提供的依賴管理工具,通過去中心化設(shè)計和內(nèi)置的版本控制機(jī)制,實現(xiàn)了高效、安全的依賴管理,需要的朋友可以參考下
    2026-06-06

最新評論

宁南县| 苗栗县| 宁海县| 湘潭市| 平顶山市| 霍林郭勒市| 临城县| 镇坪县| 吴桥县| 宝兴县| 南汇区| 乡城县| 射洪县| 琼海市| 安顺市| 江源县| 和顺县| 望都县| 合作市| 札达县| 马关县| 鹤峰县| 松原市| 清镇市| 大同县| 防城港市| 井陉县| 钦州市| 抚远县| 清丰县| 望奎县| 黔江区| 大同市| 汪清县| 古田县| 云龙县| 平阳县| 沈阳市| 荆门市| 临颍县| 泗洪县|