• Golang中的New和Make:内存分配与初始化的区别


    摘要:本文将深入探讨Golang中的NewMake函数在内存分配和初始化方面的区别。我们将通过理论阐述和示例代码来解释这两个函数的作用,并帮助读者更好地理解它们在实际编程中的应用。

    一、引言

    在Golang中,NewMake是用于内存分配和初始化的重要函数。虽然它们都涉及到内存的分配,但在对象创建和初始化方面存在一些差异。了解这些差异有助于我们更好地选择合适的函数来满足不同的需求。

    二、理论背景

    1. New函数

    New函数用于分配内存并返回一个指向该内存的指针。它接受一个参数类型作为参数,并返回一个指向该类型的零值的指针。这意味着使用New创建的对象会被初始化为其类型的零值。例如,使用Newint将返回一个指向整数的指针,但该整数的值为零。

    2. Make函数

    相比之下,Make函数用于创建并初始化一个或多个对象。它接受一个类型作为参数,并返回一个已初始化的对象或切片。与New不同,Make会根据类型的初始化规则对对象进行初始化,这意味着它不仅分配内存,还会将内存初始化为类型的非零值。

    三、示例代码

    为了更好地理解NewMake的差异,让我们通过一些示例代码来深入探讨。

    1. New示例

    package main
    
    import "fmt"
    
    type Person struct {
        Name string
        Age  int
    }
    
    func main() {
        p := New(Person) // 使用New分配内存并返回指向Person类型的零值的指针
        fmt.Println(p)    // 输出:&{ 0}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在上面的示例中,我们使用New函数创建了一个指向Person类型的零值的指针。由于Person结构体的字段类型是非零值,因此这些字段的值将为零值(例如,字符串为空字符串,整数为0)。

    2. Make示例

    package main
    
    import "fmt"
    import "container/vector" // 导入vector包以使用Make函数创建向量
    
    func main() {
        v := Make(vector.Vector, 0, 0) // 使用Make创建并初始化一个向量,初始大小为0,容量为0
        fmt.Println(v)               // 输出:[]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在上面的示例中,我们使用Make函数创建并初始化了一个向量。由于向量的初始大小和容量都为0,因此它的值为空向量(即长度为0的向量)。但是,请注意,向量的容量将根据需要动态增长。

    四、结论与建议

    通过以上理论阐述和示例代码,我们可以得出以下结论:

    1. New函数用于分配内存并返回指向类型的零值的指针。这意味着使用New创建的对象会被初始化为类型的零值。在需要创建具有默认值的对象时,可以使用New。例如,对于整数类型,使用Newint将返回一个指向整数的指针,整数的值为零。
    2. Make函数用于创建并初始化一个或多个对象。与New不同,Make会根据类型的初始化规则对对象进行初始化,将其初始化为非零值。因此,当需要创建已经初始化的对象时,可以使用Make。例如,使用Make可以创建一个初始大小和容量为0的向量,但实际使用时向量的大小会动态增长。
    3. 在实际编程中,选择使用New还是Make取决于具体的需求。如果只需要创建一个具有默认值的对象,可以使用New;如果需要创建一个已经初始化的对象或切片,可以使用Make。同时,也要注意不同类型的对象或切片的初始化规则,以确保正确使用这两个函数。

    五、示例:使用New和Make在实践中

    让我们通过一个具体的示例来进一步说明NewMake在实际编程中的应用。

    假设我们正在开发一个电子商务网站,需要在购物车中保存用户的商品列表。我们可以使用切片来存储商品,每个商品是一个结构体实例。

    首先,我们定义一个Product结构体,表示商品:

    type Product struct {
        ID       int
        Name     string
        Price    float64
        Quantity int
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    接下来,我们使用New函数创建一个指向Product类型的零值的指针:

    p := New(Product)
    
    • 1

    然后,我们可以使用该指针创建一个商品对象,并为其字段赋予实际的值:

    p.ID = 1
    p.Name = "Apple iPhone 13"
    p.Price = 999.99
    p.Quantity = 1
    
    • 1
    • 2
    • 3
    • 4

    现在,我们可以将该商品添加到购物车中。购物车可以使用切片来存储商品:

    cart := Make(vector.Vector, 0, 10) // 使用Make创建一个初始大小为0,容量为10的向量来存储商品
    
    • 1

    然后,我们可以将商品对象添加到购物车中:

    cart.PushBack(p) // 将商品添加到购物车中
    
    • 1

    现在,购物车中有了一个商品。我们可以继续添加更多的商品到购物车中,直到用户结账。

    六、总结与建议

    在Golang中,NewMake是用于内存分配和初始化的重要函数。New函数用于分配内存并返回指向类型的零值的指针,而Make函数用于创建并初始化一个或多个对象。选择使用哪个函数取决于具体的需求。如果需要创建一个具有默认值的对象,可以使用New;如果需要创建一个已经初始化的对象或切片,可以使用Make。同时,要注意不同类型的对象或切片的初始化规则,以确保正确使用这两个函数。在实际编程中,灵活运用NewMake可以有效地管理内存并提高程序的性能。

  • 相关阅读:
    Matlab画圆且坐标轴图片等比例显示
    ansible自动化部署web服务
    三国志14信息查询小程序(历史武将信息一览)制作更新过程06-复现小程序
    C#基础知识
    DL Homework 6
    PCIe系统中Switch介绍
    【工具推荐】KeePass安装与插件推荐
    曲线救国|基于函数计算FC3.0部署AI数字绘画stable-diffusion
    resize2fs: New size too large to be expressed in 32 bits
    Postman —— post请求数据类型
  • 原文地址:https://blog.csdn.net/hitpter/article/details/134065611