Go中的make函数用于创建和初始化切片(slice)、映射(map)、以及通道(channel)。

  1. 创建切片,必须指定长度,但容量可以省略,当容量被缺省时,容量等于长度,例如,

    mySilce := make([]int, 5)
    fmt.Println(len(mySilce), cap(mySilce)) // 输出:5 5

    另外,当对切片进行插入操作导致,切片的长度超过容量,将会触发切片扩容, 当切片的容量小于1000时,新的切片会翻倍,当切片的容量大于1000时,通常会平缓的扩容(不同版本的go有不同的处理方式)。这也导致了,扩容带来的效率问题,因为每次扩容都需要将旧的切片中的所有元素复制到新的切片中。

  2. 创建map
    当使用 make 创建一个映射时,你可以选择性地指定初始容量。即使未指定容量,映射也会被正确初始化,能够正常使用。

     myMap := make(map[string]string)
     fmt.Println(len(myMap)) // 输出:0
    注意:map没有cap这个接口。

但是,

    var m map[string]int
    m["a"] = 1 //panic: assignment to entry in nil map

因为这里只是声明了一个map变量,并未给他分配空间。

  1. 通道
    在 Go 中,make 也可以用于创建通道。对于通道,你可以选择性地指定其缓冲区大小。如果未指定缓冲区大小,则通道将是无缓冲通道。

    ch := make(chan int)        // 无缓冲通道
    ch := make(chan int, cap)   // 有缓冲通道,缓冲区大小为 cap

Francis_Hui
1 声望0 粉丝