博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【GoLang】GoLang 中 make 与 new的区别
阅读量:6946 次
发布时间:2019-06-27

本文共 1565 字,大约阅读时间需要 5 分钟。

make、new操作

make用于内建类型(mapslice 和channel)的内存分配。new用于各种类型的内存分配。

内建函数new本质上说跟其它语言中的同名函数功能一样:new(T)分配了零值填充的T类型的内存空间,并且返回其地址,即一个*T类型的值。用Go的术语说,它返回了一个指针,指向新分配的类型T的零值。有一点非常重要:

new返回指针。

内建函数make(T, args)new(T)有着不同的功能,make只能创建slicemapchannel,并且返回一个有初始值(非零)的T类型,而不是*T。本质来讲,导致这三个类型有所不同的原因是指向数据结构的引用在使用前必须被初始化。例如,一个slice,是一个包含指向数据(内部array)的指针、长度和容量的三项描述符;在这些项目被初始化之前,slicenil。对于slicemapchannel来说,make初始化了内部的数据结构,填充适当的值。

make返回初始化后的(非零)值。

下面这个图详细的解释了newmake之间的区别。

图2.5 make和new对应底层的内存分配

零值

关于“零值”,所指并非是空值,而是一种“变量未填充前”的默认值,通常为0。 此处罗列 部分类型 的 “零值”

int     0int8    0int32   0int64   0uint    0x0rune    0 //rune的实际类型是 int32byte    0x0 // byte的实际类型是 uint8float32 0 //长度为 4 bytefloat64 0 //长度为 8 bytebool    falsestring  ""

代码示例:

var map1 map[string]string = make(map[string]string)    fmt.Println(map1)    fmt.Println(map1 == nil)    var map2 *map[string]string = new(map[string]string)    fmt.Println(map2)    fmt.Println(map2 == nil)    fmt.Println(*map2)    fmt.Println(*map2 == nil)    //    var map1 map[string]string    map1["aaa"] = "AAA"    map1["bbb"] = "BBB"    map1["ccc"] = "CCC"    fmt.Println(map1)    fmt.Println(len(map1))

输出:

map[]false&map[]falsemap[]truemap[bbb:BBB ccc:CCC aaa:AAA]3Success: process exited with code 0.

 

参考资料:

golang语言中map的初始化及使用: http://studygolang.com/articles/2379

Go语言中new()和 make()的区别详解: http://www.jb51.net/article/56837.htm

: http://blog.csdn.net/xtxy/article/details/51837400

golang 内置函数new() 和struct{} 初始化的区别: http://studygolang.com/articles/3377

https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.2.md

 

你可能感兴趣的文章
学Hadoop还是Spark好?
查看>>
微服务生命周期的9个任务事项
查看>>
实战Kafka ACL机制
查看>>
云监控服务使用教程
查看>>
“旧城改造”的背后——银泰新零售阿里云解决方案(上)
查看>>
java B2B2C源码电子商务平台 -SpringCloud服务相互调用RestTemplate
查看>>
java B2B2C Springcloud电子商务平台源码-zuul 过滤器机制
查看>>
分布式消息系统:Kafka
查看>>
我的友情链接
查看>>
H3C防火墙路由器做回流
查看>>
Tableau10.5视频课程之常见图形制作
查看>>
Kettle5.4实战项目培训课程
查看>>
获取局域网里一个MAC地址对于的IP地址
查看>>
让phpmailer支持中文名称的附件和邮件标题中文乱码(转)
查看>>
JavaScript强化教程——JavaScript Math(算数) 对象
查看>>
CentOS7部署Kubernetes集群
查看>>
struts2中使用DMI(动态调用方法)方式配置action
查看>>
使用hyperpacer实现AWR报告的同步收集
查看>>
关于os.popen你可能不知道的
查看>>
redhat5.3恢复***
查看>>