您现在的位置是:首页 > Javascript
当前栏目
聊聊Golang的Make和New函数
2023-02-19 12:24:26 时间
今天在聊make和new函数之前,咱们先来看一种现象 当然如果你对golang的指针还不是很了解,可以先看看这篇文章,以做到无缝连接
。看完这个,我彻底理解了golang的指针。
case1
这个例子很简单,咱们定义了一个int类型的变量,然后赋值直接输出,这个没什么好疑问的,但是咱们把这个例子改一下
case2
请问上面代码会输出什么?不出意外会输出10对不对,但是咱们运行之后,命令行却输出
这是为什么呢?
简单说说原因:
因为我们在var p *int,只是把p变量定义为了指针类型,p的默认值为nil,「并没有在内存上分配对应的空间」,既然没有空间,那给p变量赋值自然就会报错,当然p任然是占空间的,只不过p的值为nil
如果我们把代码改成下面这样:
结果就可以正常输出,为什么加个new就可以正常输出呢?想要回答这个问题,首先你得知道new函数做了什么。
new函数主要做了下面三件事
- 调用操作系统接口申请一块int类型的内存空间
- 操作系统将分配的空间返回给go程序
- 在内存中开辟了一块int的空间,并且把该空间的指针指向p 因为现在指针p已经指向了一块被分配的空间,所以可以直接进行赋值操作
小结
对于int,string,float,rune,byte,bool等类型,在定义变量的时候系统已经给申请了内存,而且给了对应的默认值(int的默认值为0,string的默认值为"",bool的默认值为false),所以我们可以直接给变量进行赋值操作。
对于指针,切片,map等类型,这些变量直接定义的时候系统是没有给分配内存的,并且默认值为nil,所以不能直接赋值。如果想赋值的话,需要用new或者make函数向系统提前申请内存才行。
make和new的区别
make和new都是用来内存分配的方法,简单的说,new只分配内存,
- 「make用于slice,map,和channel的初始化,不仅可以开辟一个内存,还能给这个内存的类型初始化其零值」。
- make返回的还是引用类型本身;而new返回的是指向类型的指针。
make
new
make只能用来分配及初始化类型为slice,map,channel的数据;new可以分配任意类型的数据。
相关文章
- p5.js 使用npm安装p5.js后如何使用?
- Fabric.js 限制边框宽度缩放
- JavaScript Array 对象高阶方法 some、filter、indexOf
- 软件测试|selenium执行js脚本
- JavaScript 实现阻碍调试
- JQuery 实现开发常用功能
- 使用 JS 检测网址能否正常加载
- 在 Windows 上快速安装 Hexo · 安装 Node.js
- xterm.js 组件实现WebSSH功能
- 让阅读无缝衔接 —— JS 获取用户阅读进度
- JavaScript 前端笔记总结(精简)
- Web优化躬行记(2)——JavaScript
- Node.js躬行记(4)——自建前端监控系统
- Node.js躬行记(3)——命令行工具
- Node.js躬行记(2)——文件系统和网络
- Node.js躬行记(1)——Buffer、流和EventEmitter
- 21种JavaScript设计模式最新记录(含图和示例)
- Vue躬行记(7)——渲染函数和JSX
- javascript原型 原型链
- JsonIgnoreProperties JsonIgnore导致RequestBody无法接受参数值