对于值类型的声明不需要在给值类型单独分配内存,是因为程序已经默认帮我们分配好了。对于引用类型的变量,我们不光要声明它,还要为它分配内容空间。要分配内存,就引出来今天的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)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。