对于值类型的申明不须要在给值类型独自分配内存,是因为程序曾经默认帮咱们调配好了。对于援用类型的变量,咱们不光要申明它,还要为它调配内容空间。要分配内存,就引出来明天的 new 和 make。
援用和指针的区别
- 相同点
都是地址的概念;
指针指向一块内存,它的内容是所指内存的地址;
援用是某块内存的别名。
- 不同点
指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元,即指针是一个实体;
援用:援用跟原来的变量本质上是同一个货色,只不过是原变量的一个别名而已。
在 Go 语言中,指针是援用的一种模式,因为它们容许间接拜访底层数据的内存地址。而在某些其余编程语言中,援用可能是指向对象的名称或别名,不波及内存地址的间接操作。
new
- new 用于创立值类型的实例,例如构造体(struct)和根本数据类型。
- new 返回的是新调配的值的指针。
- new 的参数是类型,而不是初始化参数,它只会调配零值的内存,不会执行初始化。
- new 通常用于调配值类型的零值,并返回指向这些值的指针。
-
示例
var num *int num = new(int) // 创立一个整数类型的指针,并调配零值 fmt.Println(*num) // 输入:0 type Point struct {X, Y int} p := new(Point) // 创立一个 Point 构造体的指针,其字段被初始化为零值 fmt.Println(p.X) // 输入:0
make
- make 用于创立切片、映射和通道(slice、map、channel)等援用类型的数据结构。
- make 返回的是被创立类型的援用,而不是指针。
- make 的参数通常包含类型和初始化参数,例如 make([]int, 10) 用于创立一个蕴含 10 个整数的切片。
- make 初始化创立的数据结构并返回其援用,因而它实用于须要进行初始化的数据结构。
-
示例
slice := make([]int, 5) // 创立一个蕴含 5 个整数的切片 mymap := make(map[string]int) // 创立一个字符串到整数的映射 ch := make(chan int) // 创立一个整数类型的通道
相同点
都是堆空间调配
不同点
- make: 只用于 slice、map 以及 channel 的初始化,无可替代
- new: 用于类型内存调配 (初始化值为 0)