make 仅用来分配及初始化类型为 slice、map、chan 的数据。new 可分配任意类型的数据.
new 分配返回的是指针,即类型 *Type。make 返回引用,即 Type.
new 分配的空间被清零, make 分配空间后,会进行初始化.
package main
import"fmt"type P struct{
Name string
Age int}var a *[2]intvar s *stringvar b *boolvar i *intvar ps *P
funcmain(){//new
fmt.Println("new ---- ")
a =new([2]int)
s =new(string)
b =new(bool)
i =new(int)
ps =new(P)
fmt.Println(a," ",*a)
fmt.Println(s,"",*s)
fmt.Println(b,"",*b)
fmt.Println(i,"",*i)
fmt.Println(ps,"",*ps)
fmt.Println("slice map channel")//var mp *map[string]string//mp = new (map[string]string)//(*mp)["name"] = "ic"//fmt.Println((*mp)["name"])////var ms *[]string//ms = new([]string)//(*ms)[0] ="lc"//fmt.Println((*ms)[0])//上面可以看出,silce、map、channel等类型属于引用类型,引用类型初始化为nil,nil是不能直接赋值的,也不能用new分配内存,还需要使用make来分配。//make
fmt.Println("make ---- ")//它返回的就是类型本身,而不是指针类型,因为make只能给slice,map,channel等初始化内存,它们返回的就是引用类型,那么就没必要返回指针了
mm :=make(map[string]string)
mm["name"]="lc"
fmt.Println(mm["name"])
ch :=make(chanint,1)
ch <-100
fmt.Println(<-ch)
a:=make([]int,0)
n:=20for i:=0;i<n;i++{
a =append(a,1)
fmt.Printf("len=%d cap=%d\n",len(a),cap(a))}}