广告
返回顶部
首页 > 资讯 > 精选 >Go语言中make和new有什么区别
  • 219
分享到

Go语言中make和new有什么区别

2023-07-05 07:07:15 219人浏览 独家记忆
摘要

这篇文章主要介绍“Go语言中make和new有什么区别”,在日常操作中,相信很多人在Go语言中make和new有什么区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言中make和new有什么区别”的疑

这篇文章主要介绍“Go语言中make和new有什么区别”,在日常操作中,相信很多人在Go语言中make和new有什么区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言中make和new有什么区别”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    写在前面

    虽然 make 和 new  都是能够用于初始化数据结构,但是它们两者能够初始化的结构类型却有着较大的不同;make 在 Go 语言中只能用于初始化语言中的3种类型:slice、map、chan

    slice := make([]int, 0, 100)hash := make(map[int]bool, 10)ch := make(chan int, 5)

    这些基本类型都是语言为我们提供的,我们在前面的章节中其实已经介绍过了它们初始化的过程以及原理,但是在这里还是需要提醒各位读者注意的是,这三者返回了不同类型的数据结构:

    • slice 是一个包含 datacap 和 len 的结构体

    • hash 是一个指向 hmap 结构体的指针

    • ch 是一个指向 hchan 结构体的指针

    而另一个用于初始化数据结构的关键字 new 的作用其实就非常简单了,它只是接收一个类型作为参数然后返回一个指向这个类型的指针:

    i := new(int)var v inti := &v

    上述代码片段中的两种不同初始化方法其实是等价的,它们都会创建一个指向 int 零值的指针。

    到了这里我们对 Go 语言中这两种不同关键字的使用也有了一定的了解:make 用于创建切片、哈希表和管道等内置数据结构,new 用于分配并创建一个指向对应类型的指针。

    实现原理

    接下来我们将分别介绍 make 和 new 在初始化不同数据结构时的具体过程,我们会从编译期间和运行时两个不同的阶段理解这两个关键字的原理,不过由于前面已经详细地介绍过 make 的实现原理,所以我们会将重点放在 new 上从 Go 语言的源代码层面分析它的实现。

    make

    在前面的章节中我们其实已经谈到过 make 在创建 数组和切片、哈希表 和 Channel 的具体过程,所以在这一小节中,我们也只是会简单提及 make 相关的数据结构初始化原理。

    在编译期间的 类型检查 阶段,Go 语言其实就将代表 make 关键字的 OMAKE 节点根据参数类型的不同转换成了 OMAKESLICEOMAKEMAP 和 OMAKECHAN 三种不同类型的节点,这些节点最终也会调用不同的运行时函数来初始化数据结构。

    new

    内置函数 new 会在编译期间的 SSA 代码生成 阶段经过 callnew 函数的处理,如果请求创建的类型大小时 0,那么就会返回一个表示空指针的 zerobase 变量,在遇到其他情况时会将关键字转换成 newobject

    func callnew(t *types.Type) *node {    if t.NotInHeap() {        yyerror("%v is go:notinheap; heap allocation disallowed", t)    }    dowidth(t)    if t.Size() == 0 {        z := newname(Runtimepkg.Lookup("zerobase"))        z.SetClass(PEXTERN)        z.Type = t        return typecheck(nod(OADDR, z, nil), ctxExpr)    }    fn := syslook("newobject")    fn = substArgTypes(fn, t)    v := mkcall1(fn, types.NewPtr(t), nil, typename(t))    v.SetNonNil(true)    return v}

    需要提到的是,哪怕当前变量是使用 var 进行初始化,在这一阶段可能会被转换成 newobject 的函数调用并在堆上申请内存:

    func walkstmt(n *Node) *Node {    switch n.Op {    case ODCL:        v := n.Left        if v.Class() == PAUTOHEAP {            if prealloc[v] == nil {                prealloc[v] = callnew(v.Type)            }            nn := nod(OAS, v.Name.Param.Heapaddr, prealloc[v])            nn.SetColas(true)            nn = typecheck(nn, ctxStmt)            return walkstmt(nn)        }    case ONEW:        if n.Esc == EscNone {            r := temp(n.Type.Elem())            r = nod(OAS, r, nil)            r = typecheck(r, ctxStmt)            init.Append(r)            r = nod(OADDR, r.Left, nil)            r = typecheck(r, ctxExpr)            n = r        } else {            n = callnew(n.Type.Elem())        }    }}

    当然这也不是绝对的,如果当前声明的变量或者参数不需要在当前作用域外『生存』,那么其实就不会被初始化在堆上,而是会初始化在当前函数的栈中并随着 函数调用 的结束而被销毁。

    newobject 函数的工作就是获取传入类型的大小并调用 mallocGC 在堆上申请一片大小合适的内存空间并返回指向这片内存空间的指针:

    func newobject(typ *_type) unsafe.Pointer {    return mallocgc(typ.size, typ, true)}

    mallocgc 函数的实现大概有 200 多行代码,在这一节中就不展开详细分析了,我们会在后面的章节中详细介绍 Go 语言的内存管理机制。

    到此,关于“Go语言中make和new有什么区别”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

    --结束END--

    本文标题: Go语言中make和new有什么区别

    本文链接: https://www.lsjlt.com/news/350082.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • Go语言中make和new有什么区别
      这篇文章主要介绍“Go语言中make和new有什么区别”,在日常操作中,相信很多人在Go语言中make和new有什么区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言中make和new有什么区别”的疑...
      99+
      2023-07-05
    • go语言中的new与make有什么区别
      本篇内容主要讲解“go语言中的new与make有什么区别”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“go语言中的new与make有什么区别”吧!new() 和...
      99+
      2022-10-18
    • GO语言make和new关键字有什么区别
      今天小编给大家分享一下GO语言make和new关键字有什么区别的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. new 和...
      99+
      2023-07-06
    • go语言中make和new的区别有哪些
      这篇文章主要介绍“go语言中make和new的区别有哪些”,在日常操作中,相信很多人在go语言中make和new的区别有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”go语言中make和new的区别有哪些...
      99+
      2023-07-04
    • 详解Go语言中make和new的区别
      目录写在前面实现原理makenew总结参考写在前面 虽然 make 和 new  都是能够用于初始化数据结构,但是它们两者能够初始化...
      99+
      2023-02-26
      Go语言make new区别 Go语言make new Go make new
    • Go语言中new和make关键字有哪些区别
      本篇内容介绍了“Go语言中new和make关键字有哪些区别”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!newnew 是一个内置函数,它会分...
      99+
      2023-07-05
    • GO语言make和new关键字的区别
      目录1. new 和 make2. make和new比较3. new函数4. make函数make使用场景 slice map channelnew 使用场景 大部分使用在结构体当中...
      99+
      2023-05-15
      Go语言 new make关键词区别 Go语言 new make关键词 Go语言 new make
    • Go语言中new和make关键字的区别是什么
      这篇文章主要介绍了Go语言中new和make关键字的区别是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言中new和make关键字的区别是什么文章都会有所收获,下面我们一起来看看吧。newnew 是一...
      99+
      2023-07-05
    • Go语言中make和new函数的用法与区别
      相同点: make和new都是用来创建分配类型内存的。 不同点: 先看下面的代码 package main import "fmt" func main(){ var i *in...
      99+
      2022-11-13
    • Go语言中make和new函数怎么使用
      这篇文章主要讲解了“Go语言中make和new函数怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言中make和new函数怎么使用”吧!相同点:make和new都是用来创建分配类...
      99+
      2023-07-02
    • Go语言的make和new实现原理是什么
      这篇文章主要介绍“Go语言的make和new实现原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Go语言的make和new实现原理是什么”文章能帮助大家解决问题。概述虽然 make...
      99+
      2023-07-05
    • python和go语言有什么区别
      这篇文章给大家介绍python和go语言有什么区别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,Python对代码格式的要求没有那么严...
      99+
      2023-06-14
    • python和go语言的区别有什么
      本篇文章为大家展示了python和go语言的区别有什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。go语言Go(又称 Golang)是 Google 的 Robert Griesemer,Rob ...
      99+
      2023-06-15
    • go语言与gojs有什么区别
      go语言与gojs区别:1、Go语言的设计目标是提供一种简单、高效且安全的编程语言,而GoJS的设计目标是提供一个功能强大的图形化库,用于创建交互式的图形和数据可视化;2、Go语言的语法类似于C语言,而GoJS是一个基于JavaScript...
      99+
      2023-08-03
    • go语言和c语言在指针上有什么区别
      区别:1、go语言可以使用new关键字来分配内存创建指定类型的指针,而c语言不行。2、c语言中数组名arr代表的是数组首元素的地址,相当于“&arr[0]”;go语言中数组名arr不代表数组首元素的地址,代表的是整个数组的值。3、g...
      99+
      2023-05-14
      C语言 指针 go语言 Golang Go
    • go语言切片和变量有什么区别
      go语言切片和变量有:1、切片是一种引用类型,而变量是一种值类型;2、切片具有动态扩容的能力,而变量的大小是固定的;3、切片可以通过切片表达式来提取部分元素,而变量只能访问整个值;4、切片还可以与其他切片共享底层数据,而变量是独立的。本教程...
      99+
      2023-07-14
    • Go 语言中的数组和切片有什么区别?
      在 Go 语言中,数组和切片都是常见的数据结构。尽管它们都可以用于存储相同类型的数据,但它们在语义上具有不同的行为,这使得它们在实际使用中有着不同的用途。 数组 数组是一种固定长度、存储相同类型元素的集合。在 Go 语言中,数组的长度...
      99+
      2023-10-07
      数组 git 日志
    • go语言和java的区别是什么
      本篇内容主要讲解“go语言和java的区别是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“go语言和java的区别是什么”吧!区别:1、Go不允许函数重载,java允许;2、Java默认允许...
      99+
      2023-07-04
    • go语言和python有哪些区别
      go语言和python的区别:1、语法和设计;2、并发处理;3、标准库和生态系统;4、应用领域;5、性能;6、学习曲线;7、内存管理;8、类型系统;9、语法糖;10、包管理;11、调试和测试。详细介绍:1、语法和设计,Go语言是一种编译型语...
      99+
      2023-12-11
      go语言 python
    • go语言和swoole有哪些区别
      这篇“go语言和swoole有哪些区别”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“go语言和swoole有哪些区别”文章吧...
      99+
      2023-06-29
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作