new

new只接受一个参数,该参数是一个类型(int, string, bool)
分配好内存后,返回一个(指向该类型内存地址的)指针

  1. func main {
  2. var i *int
  3. i = new(int)
  4. fmt.Println(i) // 0xc000062068 它返回的永远是类型的指针,指向分配类型的内存地址
  5. fmt.Println(*i) // 0 int置为零值, string为"", bool为false
  6. *i = 10
  7. fmt.Println(*i) // 10
  8. }
  9. // new不常用,通常都是采用短语句(:=)声明以及结构体的字面量达到我们的目的
  10. i := 10

make

make也是用于内存分配的,但和new不同,它只用于通道chan、映射map以及切片slice的内存创建
它的返回的类型就是这三个类型本身,而不是他们的指针类型,因为这三种类型本身就是引用类型
注意,因为这三种类型是引用类型,所以必须得初始化,但不是置为零值

切片slice

  1. //创建一个初始元素长度为5的数组切片,元素初始值为0:
  2. mySlice1 := make([]int, 5)
  3. //创建一个初始元素长度为5的数组切片,元素初始值为0,并预留10个元素的存储空间:
  4. mySlice2 := make([]int, 5, 10)
  5. //切片字面量创建长度为5容量为5的切片,
  6. //需要注意的是 [ ] 里面不要写数组的容量,因为如果写了个数以后就是数组了,而不是切片了。
  7. mySlice3 := []int{10,20,30,40,50}

映射map

  1. //创建了一个键类型为string、值类型为PersonInfo
  2. myMap = make(map[string] PersonInfo)
  3. //也可以选择是否在创建时指定该map的初始存储能力,创建了一个初始存储能力为100的map.
  4. myMap = make(map[string] PersonInfo, 100)
  5. //创建并初始化map的代码.
  6. myMap = map[string] PersonInfo{
  7. "1234": PersonInfo{"1", "Jack", "Room 101,..."},
  8. }

通道channel

  1. //创建有缓存通道
  2. ch := make(chan int, 10)
  3. //创建无缓存通道
  4. ch := make(chan int)

关于channel详细介绍可看:https://www.yuque.com/dimiteli/io0pw2/apog23