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

这篇具有很好参考价值的文章主要介绍了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}
}

在上面的示例中,我们使用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)               // 输出:[]
}

在上面的示例中,我们使用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
}

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

p := New(Product)

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

p.ID = 1
p.Name = "Apple iPhone 13"
p.Price = 999.99
p.Quantity = 1

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

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

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

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

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

六、总结与建议

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

到了这里,关于Golang中的New和Make:内存分配与初始化的区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • golang变量初始化顺序

    顺序: 1.引用的包 2.全局变量 3.init()函数 4.main()函数 输出 $ go run 1.go pkg init func() main init main()

    2024年04月17日
    浏览(34)
  • 三、Kafka生产者1---Kafka生产者初始化-new KafkaProducer

    概述 本文主要是分享Kafka初始化生产者的 大体过程 初始化过程中会新建很多对象,本文暂先分享部分对象 1.分区器---Partitioner partitioner 2.重试时间---long retryBackoffMs 3.序列化器---SerializerK keySerializer,SerializerV valueSerializer 4.拦截器--- ListProducerInterceptorK, V interceptorList 5.累加器-

    2024年03月14日
    浏览(50)
  • 【Golang入门教程】Go语言变量的初始化

    强烈推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站: 人工智能 推荐一个个人工作,日常中比较常用的人工智能工具,无需魔法,忍不住分享一下给大家。点击跳转到网站: 人工智能工具 引言 在Go语言中,变量

    2024年04月17日
    浏览(58)
  • Matlab和Python的初始化内存开销

    Matlab矩阵初始化: A=zeros(10000,10000); A=zeros(20000,20000); A=zeros(30000,30000); 错误使用 zeros 请求的 30000x30000 (6.7GB)数组超过预设的最大数组大小。创建大于此限制的数组可能需要较长时间,并且会导致 MATLAB 无响应。有关详细信息,请参阅 array size limit 或预设面板。 维数为30000及以上

    2024年02月05日
    浏览(32)
  • arm64内核内存布局-之vmemmap(page初始化)

            vmemmap是内核中page 数据的虚拟地址。针对sparse内存模型。内核申请page获取的page地址从此开始。 section的概念: SPARSEMEM内存模型引入了section的概念,可以简单将它理解为struct page的集合(数组)。内核使用struct mem_section去描述section,定义如下: 其中的section_mem_map成员

    2024年02月15日
    浏览(35)
  • 从内核源码看 slab 内存池的创建初始化流程

    在上篇文章 《细节拉满,80 张图带你一步一步推演 slab 内存池的设计与实现 》中,笔者从 slab cache 的总体架构演进角度以及 slab cache 的运行原理角度为大家勾勒出了 slab cache 的总体架构视图,基于这个视图详细阐述了 slab cache 的内存分配以及释放原理。 slab cache 机制确实比

    2023年04月12日
    浏览(41)
  • Fluent中的各种初始化

    初始条件指的是初始时刻计算域所处的状态。通常需要人为指定。对于稳态问题,初始条件不会影响最终结果,但是会影响到计算收敛过程。若设定的初始条件与真实状态有较大差异时,可能会造成计算不收敛。对于瞬态问题,初始条件会直接影响计算结果。 在Fluent中进行求

    2024年02月16日
    浏览(31)
  • 初始化vue中data中的数据

    当组件的根元素使用了v-if的时候, 并不会初始化data中的数据 如果想完全销毁该组件并且初始化数据,需要在使用该组件的本身添加v-if 或者是手动初始化该组件中的数据 下面详细说说Object.assign的用法: ES6的官方文档的解释是:Object.assign() 方法用于将所有可枚举属性的值从一

    2024年02月05日
    浏览(25)
  • 中移(苏州)软件技术有限公司面试问题与解答(2)—— Linux内核内存初始化的完整流程1

    接前一篇文章:中移(苏州)软件技术有限公司面试问题与解答(1)—— 可信计算国密标准 本文参考以下文章: 启动期间的内存管理之初始化过程概述----Linux内存管理(九) Linux初始化 特此致谢! 本文对于中移(苏州)软件技术有限公司面试问题中的“(8)Linux内核内存初

    2024年01月23日
    浏览(36)
  • Android---Class 对象在执行引擎中的初始化过程

    一个 class 文件被加载到内存中的步骤如下图所示: 装载  装载是指 Java 虚拟机查找 .class 文件并生成 字节流 ,然后根据字节流创建 java.lang.Class 对象的过程。 1. ClassLoader 通过一个类的 全限定名 ( 包名+类名 )来查找 .class 文件,并生成二进制字节流。其中 class 字节码文件

    2024年02月07日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包