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。
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。
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。
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 之间通信的对象。
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
内置函数。