Gomake函数教程描述了make函数并展示了如何使用它。
make是一个内置函数,用于分配和初始化slice、map或chan类型的对象。
func make(t Type, size ...IntegerType) Type
在切片的情况下,大小指定了它的长度。可以指定第二个整数来设置切片的容量;它不能小于长度。make([]int,0,5)分配一个大小为5的底层数组,并返回由该底层数组支持的长度为0、容量为5的切片。
在地图的情况下,一个空地图分配有足够的空间来容纳指定数量的元素。我们可以省略大小参数,在这种情况下分配一个小的起始大小。
在通道的情况下,通道的缓冲区被初始化为指定的缓冲区容量。如果为零,或者省略了大小,则通道是无缓冲的。
$ go version go version go1.18.1 linux/amd64
我们使用Go版本1.18。
去制作切片
在第一个示例中,我们使用make创建了一个空的整数切片。
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函数和文字创建切片集合。
vals := make([]int, 5) fmt.Println(vals)
我们创建一个新切片,其中五个元素初始化为0。
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)
要添加新值,可以使用append函数。
$ go run main.go [0 0 0 0 0] [12 18 13 19 38] [12 18 13 19 38] [] [1 2 5 6]
去切片切片
在下面的示例中,我们使用make创建一个切片的切片。
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)
}
该示例创建了一个由各种长度的字符串切片组成的切片。
w := make([][]string, 3)
我们创建一片切片。
w1 := make([]string, 4) w1[0] = "war" w1[1] = "water" w1[2] = "wrath" w1[3] = "wrong"
每个子切片都是使用make单独创建并初始化的。
$ go run main.go [[war water wrath wrong] [car cup cloud] [boy brown]]
去制作地图
在下一个示例中,我们使用make创建一个新地图。
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)
}
该示例创建一个新地图并向其添加三对。
$ go run main.go map[be:Belgium lu:Luxembourgh nl:Netherlands] map["be":"Belgium" "lu":"Luxembourgh" "nl":"Netherlands"]
去制作频道
在下面的例子中,我们使用make函数来创建一个通道。通道是goroutines通信的对象。
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)
}
}
fibgoroutine内部生成了一系列斐波那契值。这些值通过通道一个一个地发送给调用者goroutine。
$ go run main.go 0 1 1 2 3 5 8 13 21 34
在本教程中,我们展示了如何使用make内置函数。
列出所有Go教程。
