new
new只接受一个参数,该参数是一个类型(int, string, bool)
分配好内存后,返回一个(指向该类型内存地址的)指针
func main {
var i *int
i = new(int)
fmt.Println(i) // 0xc000062068 它返回的永远是类型的指针,指向分配类型的内存地址
fmt.Println(*i) // 0 int置为零值, string为"", bool为false
*i = 10
fmt.Println(*i) // 10
}
// new不常用,通常都是采用短语句(:=)声明以及结构体的字面量达到我们的目的
i := 10
make
make也是用于内存分配的,但和new不同,它只用于通道chan、映射map以及切片slice的内存创建
它的返回的类型就是这三个类型本身,而不是他们的指针类型,因为这三种类型本身就是引用类型
注意,因为这三种类型是引用类型,所以必须得初始化,但不是置为零值
切片slice
//创建一个初始元素长度为5的数组切片,元素初始值为0:
mySlice1 := make([]int, 5)
//创建一个初始元素长度为5的数组切片,元素初始值为0,并预留10个元素的存储空间:
mySlice2 := make([]int, 5, 10)
//切片字面量创建长度为5容量为5的切片,
//需要注意的是 [ ] 里面不要写数组的容量,因为如果写了个数以后就是数组了,而不是切片了。
mySlice3 := []int{10,20,30,40,50}
映射map
//创建了一个键类型为string、值类型为PersonInfo
myMap = make(map[string] PersonInfo)
//也可以选择是否在创建时指定该map的初始存储能力,创建了一个初始存储能力为100的map.
myMap = make(map[string] PersonInfo, 100)
//创建并初始化map的代码.
myMap = map[string] PersonInfo{
"1234": PersonInfo{"1", "Jack", "Room 101,..."},
}
通道channel
//创建有缓存通道
ch := make(chan int, 10)
//创建无缓存通道
ch := make(chan int)
关于channel详细介绍可看:https://www.yuque.com/dimiteli/io0pw2/apog23