Golang 的 make()、cap()、len()

Golang 的 make()、cap()、len()

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

}

LICENSED UNDER CC BY-NC-SA 4.0
Comment