iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > GO >golang中new与make的区别讲解
  • 786
分享到

golang中new与make的区别讲解

golang中new与make的区别golang中new与makegolangnewgomake 2023-01-12 15:01:55 786人浏览 薄情痞子
摘要

目录new和makenew使用new初始化零值new(struct)和&struct{}区别小结make使用示例总结:new和make new // The new buil

new和make

new

// The new built-in function allocates memory. The first argument 
// is a type,not a value, and the value returned is a pointer to a
// newly // allocated zero value of that type.
func new(Type) *Type

对于官方是这么解释new的:这个内置函数功能是分配内存。第一个参数是一个自定义类型,并不是一个值,返回值为一个指向新分配好的内存空间的一个指定类型指针,并且这个内存空间会被清零(也就是变为该类型的零值)。

使用new初始化

至于使用new进行初始化,根据语言规范:The built-in function new takes a type T and returns a value of type *T. The memory [pointed to] is initialized as described in the section on initial values.因为Go中的函数不能被重载,并且这不是可变参数,所以无法传递任何初始化数据。 取而代之的是,go将使用对类型和任何成员字段适当的任何0版本进行初始化。

零值

go语言总共分为四大类型:基本数据类型、复杂数据类型、引用数据类型和接口类型。零值是指基本数据类型和指针的初始值。
数值型零值为0、string的零值为""、bool的零值为false、指针的零值为nil

使用示例(new也可以为数组分配内存)

 a := new(int)
 fmt.Printf("类型为:%T, 值为:%v\n", a, a)
 fmt.Printf("类型为:%T, 值为:%v\n", *a, *a)
 b := new(string)
 fmt.Printf("类型为:%T, 值为:%v\n", b, b)
 fmt.Printf("类型为:%T, 值为:%v\n", *b, *b)
 c := new(*int)
 fmt.Printf("类型为:%T, 值为:%v\n", c, c)
 fmt.Printf("类型为:%T, 值为:%v\n", *c, *c)
 
 运行结果:
 类型为:*int, 值为:0xc0000a6058
 类型为:int, 值为:0               
 类型为:*string, 值为:0xc000088220
 类型为:string, 值为:             
 类型为:**int, 值为:0xc0000ca020  
 类型为:*int, 值为:<nil>  

new(struct)和&struct{}区别

因为struct{}这种操作可以对类型进行初始化,并且基于上述new的理解之后就会发现&struct{}new(struct)其实这两种声明方式几乎没有区别。但我们在项目中经常会使用到这两种操作,就自然会想这两者的区别(跟本人一样)。

在我调查了一些资料后,我个人觉得他们唯一的区别就在于new只能声明一个零值的该类型的指针并返回,但是&struct{}可以在声明的同时进行初始化操作。

func main(){
	A := new(struct) // 只能返回一个struct的指针
	B := &struct{Id:1,Name:"张三"} // 可以返回一个带有默认值的struct的指针
}

上述例子就很好的说明了这个问题。

小结

new只能开辟单个空间,不能为引用类型开辟多个空间。并且new是对类型进行内存的开辟,返回一个指向该内存空间的指针类型。如果使用new去初始化引用数据类型,不是很合适(当然,new一个对象还是可以的)。因此就需要用到另一个内置函数make。

make

// The make built-in function allocates and initializes an object of type // slice, map, or chan (only). Like new, the first argument is a type, not a // value. Unlike new, make's return type is the same as the type of its // argument, not a pointer to it. The specification of the result depends on // the type:
func make(t Type, size ...IntegerType) Type

对于官方是这么解释make的:该函数功能是分配内存并且初始化一个切片(slice/map/channel)类型的对象。相比较内置函数new而言,make的第一个参数也是一个自定义类型,不是一个值。但make的返回类型是一个和他传入的自定义参数类型完全相同的类型。并不是一个指针去指向这个新开辟的内存空间。

make 也是用于内存分配的,但是和 new 不同,它只用于 chan、map 以及 slice 的内存创建,而且它返回的类型就是这三个类型本身,而不是他们的指针类型,因为这三种类型就是引用类型,所以就没有必要返回他们的指针了。

简述make的初始化(slice/map/channel)

在这里插入图片描述

make在对slice/map/channel这三种类型进行初始化时,在编译初期阶段,go语言就已经将代表make关键字的OMAKE节点根据参数类型的不同转换成了OMAKESLICE、OMAKEMAP、OMAKECHAN三种不同类型的节点。这些不同的节点最终会调用不同的运行时函数来初始化数据结构

使用示例

var a []int
fmt.Println(a[0])
// 运行结果
panic: runtime error: index out of range [0] with length 0

如果不对切片进行初始化,就无法使用

 var a []int
 a = make([]int, 1)
 fmt.Println(a[0])

mapchan也同理。切片需要指定长度大小,容量可以自动扩容。如果下标超出指定的长度也会出现数组越界的情况。但是map不会发生该情况。即使初始化map容量为0map底层也会自动进行扩容。对于channel来说初始化容量就是初始化缓冲区长度。

总结:

makenew共同点都是可以开辟内存空间,给变量分配内存。
不同点在于:

  • 两者的作用类型不同,newint、string、数组分配内存,makeslice、map、channel分配内存。
  • 两者的返回值不同,new的返回值类型为一个指向新分配好的内存空间的一个指定类型指针。而make的返回值类型为它本身。
  • new分配的内存空间会被清零。make分配空间之后会被初始化。
  • new分配的内存空间不一定会在堆上分配,当指向这个内存空间的指针变量作用域不会在作用域外被使用,或者说这个变量只使用一次就不再使用。那么new分配的内存空间就会在当前的函数栈中随着栈的结束而被销毁。make则会在栈上开辟一块栈帧,栈帧里面有栈的指针和栈顶指针,分别记录栈帧的空间,随着函数的执行完毕,栈里的栈帧就会自动清空。

简单的说,new只分配内存,make用于slice,map,和channel的初始化,并且不返回指针。要获得一个显式的指针,使用new进行分配,或者显式地使用一个变量的地址。

参考资料

go语言中文网
深入学习golang

到此这篇关于golang中new与make的区别的文章就介绍到这了,更多相关golang中new与make的区别内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: golang中new与make的区别讲解

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

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

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

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

下载Word文档
猜你喜欢
  • golang中new与make的区别讲解
    目录new和makenew使用new初始化零值new(struct)和&struct{}区别小结make使用示例总结:new和make new // The new buil...
    99+
    2023-01-12
    golang中new与make的区别 golang中new与make golang new go make
  • 一文详解Golang中new和make的区别
    目录1. 简介2. new 函数2.1 new 函数的作用2.2 new 函数的语法3. make 函数3.1 make 函数的作用3.2 make 函数的语法4. 区别对比4.1 ...
    99+
    2023-05-19
    Go中new和make区别 Golang new和make Golang new make
  • 浅谈Golang的new与make区别是什么
    目录newmake小结:区别:在go语言中,make和new都是内存的分配(堆上),但是make只用于slice、map以及channel的初始化(非零值);而new用于类型的内存分...
    99+
    2024-04-02
  • go语言中的new与make有什么区别
    本篇内容主要讲解“go语言中的new与make有什么区别”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“go语言中的new与make有什么区别”吧!new() 和...
    99+
    2024-04-02
  • 详解Go语言中make和new的区别
    目录写在前面实现原理makenew总结参考写在前面 虽然 make 和 new  都是能够用于初始化数据结构,但是它们两者能够初始化...
    99+
    2023-02-26
    Go语言make new区别 Go语言make new Go make new
  • 深入理解Golang make和new的区别及实现原理
    目录前言new的使用底层实现make的使用底层实现总结前言 在Go语言中,有两个比较雷同的内置函数,分别是new和make方法,二者都可以用来分配内存,那他们有什么区别呢?对于初学者...
    99+
    2024-04-02
  • Go语言中make和new函数的用法与区别
    相同点: make和new都是用来创建分配类型内存的。 不同点: 先看下面的代码 package main import "fmt" func main(){ var i *in...
    99+
    2024-04-02
  • go语言中make和new的区别有哪些
    这篇文章主要介绍“go语言中make和new的区别有哪些”,在日常操作中,相信很多人在go语言中make和new的区别有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”go语言中make和new的区别有哪些...
    99+
    2023-07-04
  • Go语言中make和new有什么区别
    这篇文章主要介绍“Go语言中make和new有什么区别”,在日常操作中,相信很多人在Go语言中make和new有什么区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言中make和new有什么区别”的疑...
    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语言中new和make关键字有哪些区别
    本篇内容介绍了“Go语言中new和make关键字有哪些区别”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!newnew 是一个内置函数,它会分...
    99+
    2023-07-05
  • C#中类与接口的区别讲解
    一、抽象类 抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必...
    99+
    2024-04-02
  • Golang中panic与recover的区别
    目录前言流程关于recover前言 与defer类似的是,goroutine 中也有一个_panic链表头指针指向一个_panic链,发生panic的时候也是在链表头插入_panic...
    99+
    2024-04-02
  • c++中malloc和new的区别
    malloc和new在c++中的主要区别在于:malloc分配的内存需手动释放,而new分配的内存自动释放。malloc分配失败返回null,new分配失败抛出异常。new自动初始化分配...
    99+
    2024-05-01
    c++
  • c++中,new和malloc的区别
    new 和 malloc 的区别:new 是类型安全的 c++ 运算符,用于创建指定类型的对象,返回指向对象的指针。malloc 是 c 标准库函数,用于分配未类型的内存块,返回指向该内...
    99+
    2024-05-01
    c++ 作用域 标准库
  • Java中wait与sleep的区别讲解(wait有参及无参区别)
    目录1. wait() 与wait( long timeout ) 区别2. wait(0) 与 sleep(0)区别3. wait 和sleep 释放代码4. wait 与 sle...
    99+
    2024-04-02
  • c#中task与thread的区别及使用讲解
    目录一.什么是thread二.什么是task三.创建一个task任务有两种模式1.使用factory创建会直接执行2.我们来看看task的生命周期3.下面演示几个控制task的方法4...
    99+
    2024-04-02
  • 浅谈js中Object.create()与new的具体实现与区别
    目录Object.create与new区别Object.create()原理new原理继承比较组合继承与寄生组合继承组合继承寄生组合继承Object.create与new区别 fun...
    99+
    2024-04-02
  • linux make命令与Makefile的区别是什么
    这篇文章主要讲解了“linux make命令与Makefile的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux make命令与Makefile的区别是什么”吧!Make命...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作