golang make和new的区别

对于值类型的声明不需要在给值类型单独分配内存,是因为程序已经默认帮我们分配好了。对于引用类型的变量,我们不光要声明它,还要为它分配内容空间。要分配内存,就引出来今天的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)

你可能感兴趣的:(go)