当前位置:

首页 > 编程开发 > Golang new与make指针区别解析

Golang new与make指针区别解析

在Go语言中,new用于分配零初始化内存并返回指针,适用于基本类型和结构体;make用于创建slice、map和channel并返回类型本身。1.new分配指定类型的零值内存并返回指针,适合需要修改底层值的场景;2.make执行类型特定初始化,用于创建slice、map和channel三种复合类型;3.选择new还是make取决于需求,复合类型用make,其他类型用new;4.两者的性能差异可忽略,应优先根据用途选择合适的方法。

本文目录

    在Go语言中,new用于分配零初始化内存并返回指针,适用于基本类型和结构体;make用于创建slice、map和channel并返回类型本身。1.new分配指定类型的零值内存并返回指针,适合需要修改底层值的场景;2.make执行类型特定初始化,用于创建slice、map和channel三种复合类型;3.选择new还是make取决于需求,复合类型用make,其他类型用new;4.两者的性能差异可忽略,应优先根据用途选择合适的方法。

    Golang的new和make函数在指针上的区别 深入内存初始化细节

    Go语言中new和make都用于分配内存,但它们服务于不同的目的。简单来说,new用于分配零初始化的内存,返回指向该内存的指针;而make用于创建slice、map和channel这三种类型,并返回它们本身,而不是指针。理解它们之间的差异,能更好地掌握Go的内存管理。

    Golang的new和make函数在指针上的区别 深入内存初始化细节

    new函数分配指定类型的零值内存,并返回指向该内存的指针。这意味着分配的内存会被初始化为该类型的默认零值。例如,int类型的零值是0,string类型的零值是空字符串""。

    Golang的new和make函数在指针上的区别 深入内存初始化细节

    make函数则不同,它只能用于slice、map和channel的创建和初始化。make返回的是类型本身,而不是指针。它会执行更复杂的初始化过程,以便这些类型可以直接使用。

    new函数如何影响指针行为?

    new返回的是一个指针,指向新分配的零值内存。这意味着你可以通过这个指针来修改底层的值。例如:

    Golang的new和make函数在指针上的区别 深入内存初始化细节
    package main
    
    import "fmt"
    
    func main() {
        ptr := new(int)
        fmt.Println("Initial value:", *ptr) // Output: Initial value: 0
    
        *ptr = 10
        fmt.Println("Modified value:", *ptr) // Output: Modified value: 10
    }

    在这个例子中,new(int)分配了一个int类型的内存,并将其初始化为0。通过解引用指针ptr,我们可以修改这个值。

    make函数在初始化slice、map和channel时做了什么?

    make函数在初始化slice、map和channel时,执行了特定于类型的初始化操作。

    • Slice: make([]T, length, capacity) 创建一个长度为length,容量为capacity的切片。底层数组会被分配,并且切片会指向这个数组。
    • Map: make(map[K]V) 创建一个空的map,用于存储键值对。
    • Channel: make(chan T, bufferSize) 创建一个带有指定缓冲区大小的channel,用于goroutine之间的通信。

    例如,创建一个切片:

    package main
    
    import "fmt"
    
    func main() {
        slice := make([]int, 5, 10)
        fmt.Println("Slice:", slice)        // Output: Slice: [0 0 0 0 0]
        fmt.Println("Length:", len(slice))   // Output: Length: 5
        fmt.Println("Capacity:", cap(slice)) // Output: Capacity: 10
    }

    在这个例子中,make([]int, 5, 10) 创建了一个长度为5,容量为10的int类型切片。切片中的元素被初始化为int的零值,即0。

    何时应该使用new,何时应该使用make?

    选择使用new还是make,取决于你要分配内存的类型。

    • 如果你需要分配零初始化的内存,并且需要一个指向该内存的指针,那么使用new。这通常用于结构体或者基本类型。
    • 如果你需要创建slice、map或者channel,那么使用make。make会执行类型特定的初始化操作,并返回可以直接使用的类型实例。

    一个简单的经验法则是:如果你要创建的是一个复合类型(slice、map、channel),使用make;否则,使用new。

    make和new在性能上有差异吗?

    通常情况下,make和new的性能差异可以忽略不计。make函数可能包含一些额外的初始化步骤,但这些步骤通常很快。更重要的是,选择正确的函数来满足你的需求,而不是过分关注微小的性能差异。

    深入理解内存初始化:new的零值和make的类型特定初始化

    new保证分配的内存会被初始化为零值,这在某些情况下非常有用。例如,如果你需要创建一个结构体,并且希望它的字段都被初始化为默认值,那么可以使用new。

    make则更进一步,它会执行类型特定的初始化操作。例如,make创建的map会被初始化为空哈希表,make创建的channel会被初始化为可以进行goroutine通信的状态。

    理解这些差异,可以帮助你编写更高效、更安全的代码。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    windows10没有d盘如何建一个windows10创建d盘方式详细介绍
    windows10没有d盘如何建一个windows10创建d盘方式详细介绍

    有的消费者在安装完windows10系统软件以后,发觉自己的电脑中没有d盘,重做系统又很麻烦,那样如何立即建一个d盘呢?实际上创建方式比较简单,你先鼠标右键此电脑,开启管理方法控制面板,以后进行存放的拓展项,开启磁盘管理,在打开界面中鼠标右键,选择压缩卷,以后选择新建简单卷,那样就能创建d盘了。windows10没有d盘如何建一个:1、进到管理页面:在电脑中,电脑鼠标右键单击此电脑,打开菜单,选择管理方法选项。2、开启磁盘管理选项:在管理页面中,开启磁盘管理选项。3、选择压缩卷选项:选择硬盘,鼠标右键打开

    java如何使用clone()代替new
    java如何使用clone()代替new

    使用clone()代替new在Java中新建对象实例最常用的方法是使用new关键字。JDK对new的支持非常好,使用new关键字创建轻量级对象时,速度非常快。但是,对于重量级对象,由于对象在构造函数中可能会进行一些复杂且耗时的操作,因此,构造函数的执行时间可能会比较长。导致系统短期内无法获得大量的实例。为了解决这个问题,可以使用Object.clone()方法。Object.clone()方法可以绕过构造函数,快速复制一个对象实例。但是,在默认情况下,clone()方法生成的实例只是原对象的浅拷贝。这里不

    如何在Java中使用new关键字实例化对象
    如何在Java中使用new关键字实例化对象

    1.概念就是“创建一个Java对象”-----分配内存并返回指向该内存的引用。2.注意事项(1)Java关键字new是一个运算符。与+、-、*、/等运算符具有相同或类似的优先级。(2)创建一个Java对象需要三步:声明引用变量、实例化、初始化对象实例。(3)实列化之前会默认调用父类的无参构造,也就是要创建父类的对象3.两种实例化方法(1)对象名=new类名(参数1,参数2...参数n);对象名.方法();(2)new类名(参数1,参数2...参数n).方法;4.实例用一个简单的代码来说明使对象实例化的的两

    Python中__new__方法有什么作用
    Python中__new__方法有什么作用

    一、__new__方法简介接下来通过实例逐步详细阐述__new__方法在类初始化过程中是什么样的存在!1、初始化数据加载+解析类实例classSolution(object):def__init__(self,name=None,data=None):self.name=nameself.data=data#初始化加载数据self.xml_load(self.data)defxml_load(self,data):print("初始化init",data)defParser(self):print("解析

    Java中如何使用关键字new
    Java中如何使用关键字new

    1.概念在Java语言里,“new”表达式是负责创建实例的,其中会调用构造器去对实例做初始化;构造器自身的返回值类型是void,并不是“构造器返回了新创建的对象的引用”,而是new表达式的值是新创建的对象的引用。2.用途新建类的对象3.工作机制为对象成员分配内存空间,并指定默认值对成员变量进行显式初始化执行构造方法计算并返回引用值4.实例new操作往往意味着内存中的开辟新的内存空间,这个内存空间分配在内存中的堆区,受到jvm控制,自动进行内存管理。这里我们就是用String这个类来举例说明。publicc

    Python的__Init__ 和__New__有什么区别
    Python的__Init__ 和__New__有什么区别

    简述__init____init__(self):这个方法我们相对较熟悉,他是python类中默认的初始化方法,即一个类实例化时,就会执行的方法。详解__new____new__方法重写非常固定,通常如下:def__new__(cls):returnsuper().__new__(cls)其中cls代表类本身。重写__new__方法的代码非常固定:重写__new__方法一定要returnsuper().__new__(cls),或者returnobject.__new__(cls)否则python解释器会

    opencode安装skills教程及本地配置方法
    opencode安装skills教程及本地配置方法

    遇到OpenCode Skills无法加载或配置无效?本文手把手教你完成Skills的安装、环境变量设置及本地调试,避开常见坑点,让AI助手更懂你的代码习惯。

    如何开启Visual Studio2022实时代码分析警告提示
    如何开启Visual Studio2022实时代码分析警告提示

    解决 Visual Studio 2022 编辑时不显示代码分析警告的问题。指南涵盖 .NET 项目实时分析设置、Roslyn 分析器范围调整及错误列表来源筛选,确保开发者能高效利用实时代码诊断功能。

    如何在Visual Studio2022查看变量监视窗口调试程序
    如何在Visual Studio2022查看变量监视窗口调试程序

    详解 Visual Studio 2022 调试技巧:包括断点设置、监视窗口开启方法、变量添加步骤以及通过 F10 单步执行观察变量值变化的全过程。

    Visual Studio2017设置默认编码为UTF-8不带BOM
    Visual Studio2017设置默认编码为UTF-8不带BOM

    针对 Visual Studio 2017 缺乏全局默认编码选项的情况,详解如何利用 .editorconfig 设定项目级 UTF-8 无 BOM 规则,以及手动转换现有文件并校验字节的方法。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。