乐趣区

关于go: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)
退出移动版