四. Go学习-make和new的区别

         new和make的区别,我们从下图便可看出:

         1)new是为值类型分配内存(可以任意类型的数据),其返回的是指针,指向分配类型的内存地址。         

         2)make为引用类型分配内存并初始化,如:chan、map和slice,其返回值为这个类型(引用)本身。   

         3)new 分配的空间被清零。make 分配空间后,会进行初始化;

                                               

New函数

一. 为切片分配内存

          如下面代码所示,用new分配一个切片内存后,此时slice是空的(&[]),仅仅声明了一个指针指向这个空的slice的地址。如果我们直接(*s1)[0]=100会panic,报错:index out of range

package main
import "fmt"
func test() {
	s1 := new([]int) //为slice分配内存,返回地址
	(*s1)[0] = 100
	fmt.Println(s1)
	return
}
func main() {
	test()
}

         如果我们要用这个slice,我们还需将其初始化,代码如下。我们用make对这个slice进行初始化,再赋值(*s1)[0]=100就可成功运行,结果如后图所示。

package main
import "fmt"
func test() {
	s1 := new([]int) //为slice分配内存,返回地址
	fmt.Println(s1)
	s2 := make([]int, 10) //为slice分配内存,返回值类型
	*s1 = make([]int, 5)
	(*s1)[0] = 100
	s2[0] = 100
	fmt.Println(s1)
	return
}
func main() {
	test()
}

         

 二. 为变量和自定义类型分配内存空间

          2.1为变量分配

package main
import "fmt"
func main() {
	var sum *int = new(int)    //new分配空间
	fmt.Println(*sum)
	*sum = 98                  
	fmt.Println(*sum)
}

          2.2 为自定义类型分配内存,如果我们不分配内存,就会panic。

package main
import "fmt"
func main() {
	type Student struct {
		name string
		age  int
	}
	var s *Student
	s = new(Student) //分配空间
	s.name = "dequan"
	fmt.Println(s)
}

 make

        make 也是用于内存分配的,但是和 new 不同,它只用于 chan、map 以及 slice 的内存创建,而且它返回的类型就是这三个类型本身,而不是他们的指针类型

        我们可以通过如下代码和输出结果对比观察他们区别。

package main
import "fmt"
func test() {
	s1 := new([]int) //为slice分配内存,返回地址
	fmt.Println(s1)
	s2 := make([]int, 10) //为slice分配内存,返回值类型
	fmt.Println(s2)
	*s1 = make([]int, 5)
	(*s1)[0] = 100
	s2[0] = 100
	fmt.Println(s1)
	fmt.Println(s2)
	return
}
func main() {
	test()
}

       

                                           

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值