初次接触go,对go中的make的用法还很困惑,为什么要用这个关键字,怎么使用,就找了下资料,简要总结一下make的用处和用法
make与new
make用于内建类型(map、slice和channel)的内存分配
new用于各种类型的内存分配
内建函数new本质上说跟其他语言的同名函数功能一样:new(T)分配了零值填充的T类型的内存空间,并返回其地址,即一个*T 类型的值。new为类型申请一片内存空间,并返回指向这片内存的指针
make只能创建slice、map和channel,并返回一个具有初始值(非0)的T类型,而非*T
指向数据结构的引用在使用前必须被初始化。slice是一个包含指向数据(内部array)的指针、长度和容量的三项描述符,在这些项目被初始化之前,slice为nil。对于slice、map和channel来说,make初始化了内部的数据结构,填充了适当的值。
slice
// 创建一个字符串切片,长度容量都是五个元素
slice := make([]string, 5)
// 创建一个整型切片,长度3容量5,不允许创建容量小于长度的切片
slice := make([]int, 3, 5)
map
// 声明一个key是字符串,值为int的字典,这种声明方式需要在使用之前使用make初始化
var numbers map[string] int
// 另一种map的声明方式
rating := map[string]float32 {"C":5, "Go":4.5, "Python":4.5, "C++":2}
numbers := make(map[string]int)
numbers["one"] = 1 // 赋值
numbers["ten"] = 10
numbers["three"] = 3
fmt.Println("第三个数字是:", numbers["three"]) //读取数据
- map是无序的,不能通过index获取,必须通过key获取
- map长度不固定,是引用类型
- len同样适用于map,返回map拥有的key数量
map 的 key,类型只能是:
布尔,数字,字符串,指针,通道,接口类型,结构体,包含上述内容的数组;不可以是:slice,map,function
因为:key类型只要能支持 == 和!=操作符,即可作为Key,两个值相等,可以认为是同一个Key
channels
必须使用make创建channel
ci := make(chan int)
cs := make(chan string)
cf := make(chan interface{})
ch := make(chan type, value) // value == 0无缓冲, >0 缓冲
写完感觉把slice、map和channel贴到一起来好不合适,三个的内容方向几乎毫不相干,不过,对于如何用make去构造它们也算是一个总结了