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

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

開發 后端
在文章中,我們解開了 Go 中的 new() 和 make() 函數的謎團,并解釋了它們的區別和用途。

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

在本博客文章中,我們將探討 new() 和 make() 函數之間的區別,了解何時以及如何有效地使用它們。

new() 和 make() 函數

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

new() 函數:

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

make() 函數:

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

理解 new() 函數

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

func new(Type) *Type

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

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

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

這個程序將產生如下所示的輸出。

> go run main.go
*main.Person
Name: Alice
Age: 30

理解 make() 函數

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

(1) 對于切片(Slices)

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

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

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

此程序將產生如下輸出:

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

(2) 對于映射(Maps)

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

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

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]

(3) 對于通道(Channels)

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

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

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

結論

在本博客文章中,我們解開了 Go 中的 new() 和 make() 函數的謎團,并解釋了它們的區別和用途。總結一下:

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

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

責任編輯:趙寧寧 來源: 技術的游戲
相關推薦

2023-10-27 11:27:14

Go函數

2022-10-24 00:03:26

GolangNew函數

2023-03-24 08:01:27

Go語言內存

2021-03-05 08:51:00

Go語言make

2020-09-15 12:57:56

Golangnewmake

2023-12-22 14:07:00

Go輕量級Goroutines

2023-04-09 23:09:59

Go語言函數

2024-09-10 08:49:52

Go語言內存

2018-07-09 13:40:24

前端javascript

2012-03-18 18:46:17

New iPad

2010-08-17 09:41:22

DIVSpan

2023-11-24 08:00:54

工具Go模板

2021-09-15 07:56:33

函數類型Go

2024-08-29 10:12:35

RPC通信機制遠程過程

2018-11-05 14:53:14

Go函數代碼

2023-08-18 10:34:29

2020-05-06 20:40:03

Go編程語言

2010-08-25 08:47:16

CSScellspacingcellpadding

2010-07-28 15:29:18

Flex函數

2023-04-07 08:43:47

Go語言應用場
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产美女精品视频免费观看 | 午夜激情在线 | 久久精品国产v日韩v亚洲 | 九九热免费在线观看 | 亚洲精品欧美精品 | 麻豆成人在线视频 | 久久精品亚洲精品国产欧美 | 日日操日日干 | 嫩草视频网 | 男女视频在线观看网站 | 中文字幕日韩欧美 | 国产成人精品一区二区 | 午夜激情在线视频 | 亚洲成人自拍 | 成人三级网址 | 日本在线网站 | av在线免费观看网址 | 午夜码电影 | 亚洲成人免费观看 | 欧美影院| 日本精品一区二区三区视频 | 天天精品在线 | 97国产一区二区精品久久呦 | 一区二区三区四区电影 | 欧美综合国产精品久久丁香 | 成年男女免费视频网站 | 亚洲欧洲精品一区 | 欧美日本亚洲 | 91操操操| 久久精品国产亚洲 | 久久国产精品视频 | 中文字幕在线观看一区 | 91在线资源| 国产伊人精品 | 久久国产免费看 | 亚洲国产高清高潮精品美女 | 91一区二区在线观看 | 成人小视频在线观看 | 国产91视频播放 | 国内精品视频在线观看 | 一级毛片网 |