ZetCode

Go make 函数

最后修改时间 2024 年 4 月 11 日

在本文中,我们描述了 make 函数并展示了如何使用它。

make 是一个内置函数,用于分配和初始化 slice、map 或 chan 类型的对象。

func make(t Type, size ...IntegerType) Type

对于 slice,size 指定其长度。可以指定第二个整数来设置 slice 的容量;它不能小于长度。make([]int, 0, 5) 分配一个大小为 5 的底层数组,并返回一个长度为 0、容量为 5 的 slice,该 slice 由此底层数组支持。

对于 map,会分配一个空的 map,并为其提供足够的空间来容纳指定数量的元素。我们可以省略 size 参数,在这种情况下会分配一个小的起始大小。

对于 channel,channel 的缓冲区会使用指定的缓冲区容量进行初始化。如果为零或省略了 size,则 channel 是无缓冲的。

Go make slice

在第一个示例中,我们使用 make 创建一个空的整数 slice。

main.go
package main

import (
    "fmt"
)

func main() {

    vals := make([]int, 5)
    fmt.Println(vals)

    vals[0] = 12
    vals[1] = 18
    vals[2] = 13
    vals[3] = 19
    vals[4] = 38

    fmt.Println(vals)

    vals2 := []int{12, 18, 13, 19, 38}
    fmt.Println(vals2)

    vals3 := []int{}
    fmt.Println(vals3)

    // vals3[0] = 12
    // vals3[1] = 18

    vals3 = append(vals3, 1)
    vals3 = append(vals3, 2)
    vals3 = append(vals3, 5)
    vals3 = append(vals3, 6)

    fmt.Println(vals3)
}

在本例中,我们使用 make 函数和字面量创建 slice 集合。

vals := make([]int, 5)
fmt.Println(vals)

我们创建一个新的 slice,其中包含五个初始化为 0 的元素。

vals[0] = 12
vals[1] = 18
vals[2] = 13
vals[3] = 19
vals[4] = 38

fmt.Println(vals)

稍后,我们用一些数据填充 slice。

vals2 := []int{12, 18, 13, 19, 38}
fmt.Println(vals2)

我们可以使用字面量表示法在定义 slice 时初始化它。

vals3 := []int{}
fmt.Println(vals3)

这里我们创建一个空的 slice。

// vals3[0] = 12
// vals3[1] = 18

无法向空 slice 分配值。

vals3 = append(vals3, 1)
vals3 = append(vals3, 2)
vals3 = append(vals3, 5)
vals3 = append(vals3, 6)

要添加新值,可以使用 append 函数。

$ go run main.go
[0 0 0 0 0]
[12 18 13 19 38]
[12 18 13 19 38]
[]
[1 2 5 6]

Go make slice of slices

在下面的示例中,我们使用 make 创建一个 slice of slices。

main.go
package main

import "fmt"

func main() {

    w := make([][]string, 3)

    w1 := make([]string, 4)
    w1[0] = "war"
    w1[1] = "water"
    w1[2] = "wrath"
    w1[3] = "wrong"

    w2 := make([]string, 3)
    w2[0] = "car"
    w2[1] = "cup"
    w2[2] = "cloud"

    w3 := make([]string, 2)
    w3[0] = "boy"
    w3[1] = "brown"

    w[0] = w1
    w[1] = w2
    w[2] = w3

    fmt.Println(w)
}

该示例创建一个包含不同长度字符串 slice 的 slice。

w := make([][]string, 3)

我们创建一个 slice of slices。

w1 := make([]string, 4)
w1[0] = "war"
w1[1] = "water"
w1[2] = "wrath"
w1[3] = "wrong"

每个子 slice 都是使用 make 分别创建和初始化的。

$ go run main.go
[[war water wrath wrong] [car cup cloud] [boy brown]]

Go make map

在下一个示例中,我们使用 make 创建一个新 map。

main.go
package main

import "fmt"

func main() {

    benelux := make(map[string]string)

    benelux["be"] = "Belgium"
    benelux["nl"] = "Netherlands"
    benelux["lu"] = "Luxembourgh"

    fmt.Println(benelux)
    fmt.Printf("%q\n", benelux)
}

该示例创建一个新 map 并向其中添加三个键值对。

$ go run main.go
map[be:Belgium lu:Luxembourgh nl:Netherlands]
map["be":"Belgium" "lu":"Luxembourgh" "nl":"Netherlands"]

Go make channel

在下面的示例中,我们使用 make 函数创建一个 channel。channel 是 goroutine 之间通信的对象。

main.go
package main

import (
    "fmt"
)

func fib(n int, c chan int) {

    x, y := 0, 1

    for i := 0; i < n; i++ {
        c <- x
        x, y = y, x+y
    }
    close(c)
}

func main() {

    c := make(chan int, 10)

    go fib(cap(c), c)

    for i := range c {
        fmt.Println(i)
    }
}

在 fib goroutine 中生成一系列斐波那契值。这些值通过 channel 一个接一个地发送到调用 goroutine。

$ go run main.go
0
1
1
2
3
5
8
13
21
34

来源

The Go Programming Language Specification

在本文中,我们展示了如何使用 make 内置函数。

作者

我叫 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出所有 Go 教程