Golang 的 make()、cap()、len()
make() 是什么
用于创建一个已初始化的切片、映射、或管道。
对比 new() : make只返回一个已初始化的对象,而new返回一个显式的指针。
固定长度限制的叫数组(Array) 不固定长度的叫切片(Slice)
键值对储存的叫映射(Map) 类似于 Python 字典
管道(Channel) 先进先出 类似于 Python Queue
package main
import "fmt"
func main() {
array1 := [10]string{} // 有长度限制的为数组
fmt.Println(cap(array1), len(array1))
a := make([]string, 1, 5) // make 切片
fmt.Println(cap(a), len(a))
m := make(map[string]int) // make 映射 映射的容量为动态
m["key1"] = 0
m["key2"] = 0
c := make(chan int, 10) // make 管道
fmt.Println(cap(c), len(c))
b := new([5]string)
b[0] = "hello world"
fmt.Println(cap(b), len(b))
}
cap() 和 len() 的区别
cap() 返回对象的容量
len() 返回对象的长度
package main
import "fmt"
func main() {
a := make(chan int, 5) // 初始化一个管道
a <- 1
a <- 2
a <- 3
a <- 4
fmt.Println(len(a)) // 4
fmt.Println(cap(a)) // 5
a <- 5
a <- 6 // 当管道长度到达容量上限继续添加就会报错
}
fmt.Println(<-a) // 取出一个 长度-1 就可以继续添加
数组容量不够时, 继续append数组的cap会自动翻倍
package main
import "fmt"
func main() {
c := make([]string, 0)
c = append(c, "hello world")
fmt.Println(len(c), cap(c)) // len 1 cap 1
c = append(c, "hello world")
fmt.Println(len(c), cap(c)) // len 2 cap 2
c = append(c, "hello world")
fmt.Println(len(c), cap(c)) // len 3 cap 4
c = append(c, "hello world")
fmt.Println(len(c), cap(c)) // len 4 cap 4
c = append(c, "hello world")
fmt.Println(len(c), cap(c)) // len 5 cap 8
}