Golang 内置函数 new 和 make 的区别

                                           

Go 语言中 new 和 make 都是内置函数,用于内存的分配,本文主要简述二者使用上的异同与特性。spring

new

举个例子:sql

func main() {  var i *int  *i = 1  fmt.Println(*i)}

上面的程序并不会打印1,而会抛 panic 异常,由于i是一个引用类型,须要给它分配内存空间,通俗来讲就是指针(内存地址)须要指向一片内存空间才有意义。
mybatis

为 i 分配内存:架构

func main() {  var i *int  i = new(int)  *i = 1  fmt.Println(*i)}

用 new 内置函数为 i 分配内存空间,并返回该内存空间的地址,即指针,new 函数格式以下:
app

func new(Type) *Type

可知,new 为每一个类型分配一片内存空间,初始化为 0 并返回该内存空间的地址。
分布式

new 的内存分配示意图:图片ide

其实要说明一点的就是,new 不经常使用,咱们经常会经过结构体的字面量达到 new 的效果,并且这样写也比较优雅:函数

man := &People{Name: "zhangchenghui", Age: 18, Sex: "男"}

make

make 也是分配内存分配,可是仅限 chan、map、slice 的内存建立,并返回其类型的引用,这一点很重要, chan、map、slice 其自己已是引用类型了,因此make不须要再返回其指针,引用类型的本质就是指针!例如:源码分析

type i *int;

如上,i 就是一个自定义的引用类型,其类型是一个 int 类型的指针。
ui

Make 内置函数格式:

func make(t Type, size ...IntegerType) Type

make 的内存分配示意图:图片


近期热文

RocketMQ为何要保证订阅关系的一致性?

分布式事务中间件Seata的设计原理

我对支付平台架构设计的一些思考

Go Modules踩坑总结

聊聊Tomcat的架构设计

从源码的角度解析线程池运行原理

RocketMQ消息发送的高可用设计

深度解析RocketMQ Topic的建立机制

RocketMQ源码分析之路由中心

mybatis-plus源码分析之sql注入器

钟同窗,this is for you!

Mybatis-spring源码分析之注册Mapper Bean

基于Jenkins Pipeline自动化部署

Dubbo服务暴露之注册地址和端口

Dubbo全链路追踪日志的实现

https://mp.weixin.qq.com/s/_FTH5GeWEo8IV9oOiqD3MA

相关文章
相关标签/搜索