Go中的make

157 阅读2分钟

初次接触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去构造它们也算是一个总结了