golang学习-- make 和new的区别

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]int
var s *string
var b *bool
var i *int
var ps *P


func main() {
	//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(chan int,1)
	ch <- 100
	fmt.Println(<-ch)

	a:= make([]int,0)
    n:= 20
    for i:=0;i<n;i++{
    	a = append(a,1)
    	fmt.Printf("len=%d cap=%d\n",len(a),cap(a))
	}
}

你可能感兴趣的:(golang)