文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

聊聊Golang的Make和New函数

2024-12-01 13:20

关注

。看完这个,我彻底理解了golang的指针。

case1​

var a int
a = 1
fmt.Println(a)
//返回结果
//1

这个例子很简单,咱们定义了一个int类型的变量,然后赋值直接输出,这个没什么好疑问的,但是咱们把这个例子改一下

case2​

  var p *int
*p = 10
fmt.Println(*p)

请问上面代码会输出什么?不出意外会输出10对不对,但是咱们运行之后,命令行却输出

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x2 addr=0x0 pc=0x10428df44]

goroutine 1 [running]:
main.main()

这是为什么呢?

简单说说原因:

因为我们在var p *int,只是把p变量定义为了指针类型,p的默认值为nil,「并没有在内存上分配对应的空间」,既然没有空间,那给p变量赋值自然就会报错,当然p任然是占空间的,只不过p的值为nil

如果我们把代码改成下面这样:

 var p *int = new(int)
*p = 10
fmt.Println(*p)
//输出结果
//10

结果就可以正常输出,为什么加个new就可以正常输出呢?想要回答这个问题,首先你得知道new函数做了什么。

new函数主要做了下面三件事

小结​

对于int,string,float,rune,byte,bool等类型,在定义变量的时候系统已经给申请了内存,而且给了对应的默认值(int的默认值为0,string的默认值为"",bool的默认值为false),所以我们可以直接给变量进行赋值操作。

对于指针,切片,map等类型,这些变量直接定义的时候系统是没有给分配内存的,并且默认值为nil,所以不能直接赋值。如果想赋值的话,需要用new或者make函数向系统提前申请内存才行。

make和new的区别​

make和new都是用来内存分配的方法,简单的说,new只分配内存,

make

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

new

func new(Type) *Type

make只能用来分配及初始化类型为slice,map,channel的数据;new可以分配任意类型的数据。

来源:程序员小饭内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯