Go 关键字make和new的区别

关键字make和new的区别

new

new分配空间,传递给new函数的参数是一个类型,返回值是指向这个新分配的零值的指针

函数原型

func new(Type)*Type

使用new函数为变量分配内存空间
参数:new接收参数type
返回值:返回类型的指针,指针指向分配类型的内存地址

//为默认数据类型分配空间
var num *int
num = new(int)

//为自定义类型分配空间
type  Student struct{
   name string
   age int
}
var stu *Student
stu = new(Student)

make

channel、map、slice类型是引用类型,make用于分配内存,但返回的类型就是这三个类型的引用,而不是指针

函数原型

func make(Type,size_Type)Type

参数:类型、长度
返回值:引用类型
如下栗子:

    //只声明但未初始化
    var s1 []int
	if s1 == nil {
		fmt.Printf("s1 is nil \n")
	}
	//声明并用make函数初始化,指定长度为0
	s2 := make([]int, 0)
	if s2 ==nil{
		fmt.Printf("s2 is nil ---%#v \n",s2)
	}else{
		fmt.Printf("s2 is not nil ---%#v \n",s2)
	}
    //声明并用make函数初始化,指定长度为3
	s3 := make([]int, 3)
	if s3 == nil{
		fmt.Printf("s3 is nil ---%#v \n",s3)
	}else{
		fmt.Printf("s3 is not nil ---%#v\n",s3)
	}

在这里插入图片描述

对比make和new

    var s1 = new(map[int]string)
	if *s1 == nil{
		fmt.Printf("s1 is nil --- %#v \n",s1)
	}
	s2 := make(map[int]string)
	if s2 == nil{
		fmt.Printf("s2 is nil ---%#v \n",s2)
	}else{
		fmt.Printf("s2 is not nil --- %#v \n",s2)
	}

在这里插入图片描述

make和new主要区别:

  • make只能用来分配及初始化类型为slice、map、channel的数据,即创建它们的数据结构;new可以分配任意类型的数据
  • new分配返回的是指针;make返回引用
  • new分配的空间被清零;make分配空间后会进行初始化
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值