关于new 和 make 初始化对象

在Go语言中,make和new是两个用于创建数据结构的内建函数,它们有不同的用途和行为:

make

  • make函数用于创建切片、映射和通道等引用类型的数据结构。
  • make函数返回的是初始化后的非零值对象,而不是指向新分配的零值的指针。
  • 语法:make(T, args),其中T是类型(切片、映射或通道),args是用于初始化T的参数。
  • 例如:
    • make([]int, 0, 10):创建一个长度为 0、容量为 10 的整型切片。
    • make(map[string]int):创建一个字符串键和整型值的映射。
    // init slice
    slice := make([]int, 0, 100)
    fmt.Println(slice != nil) //true

    // init hash map
    hash := make(map[int]bool, 10)
    fmt.Println(hash != nil) //true

    // init channel
    ch := make(chan int, 5)
    fmt.Println(ch != nil) //true

new

  • new函数用于为值类型(如结构体)分配内存,并返回一个指向新分配的零值的指针。
  • new函数返回的是指向类型T的指针,该指针指向的值为T的零值。
  • 语法:new(T),其中T是类型。
  • 例如:
    • new(int):分配一个整数类型的内存,并返回指向该整数的指针。
    • new(struct{}):分配一个匿名结构体的内存,并返回指向该结构体的指针。
    // new is for applying an addr for obj, then return pointer
    ptr := new(int64)
    *ptr = 4
    fmt.Println("value:", *ptr)
    
    // bad case
    var ptr2 *int64
    *ptr2 = 5 // panic

区别总结:

  • make用于引用类型(切片、映射、通道)的初始化,返回初始化后的非零值对象。
  • new用于值类型(结构体等)的内存分配,并返回指向新分配零值的指针。
  • 在实践中,一般情况下使用make来初始化切片、映射和通道,使用new来分配值类型的内存。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容