刚接触go没有多久;今天看关于“结构体字面量时产生几个问题想讨论一下,也算是一种记录”第一个问题:typePointstruct{X,Yfloat64}p:=&Point{1,2}产生疑惑的原因:Point{1,2}算是字面量,字面量基本和常量一样不能取地址,为什么这个可以?b:=&1//不能对常量取地址(常量为什么不能取地址?☺)//为什么常量不能取地址:b:=&1可认为把1放在b代表的内存地址中,而计算机中的数字是用0,1序列的补码表示的.而数字1的产生是由一些“门电路产生的高低电平表示的”,这是数字产生的时候你怎么能取地址那。自己的想法:大部分字面量和常量差不多;sturct之所以能够取地址大概因为struct在内存是连续存储的,作用类似一个变量第二个问题:typePointstruct{X,Yfloat64}funcpot(x,yfloat64)Point{returnPoint{x,y}}funcpt(x,yfloat64)*Point{return&Point{x,y}}funcmain(){pot(2,3).X=4//cannotassigntopoint(2,3).Xpt(2,3).X=4//ok}产生疑惑的原因:如果返回是*Point指针类型,pt函数中的变量Point会分配在堆上,Point作用域扩大,所以修改值没有问题;但是如果返回Point为什么再次修改值就不行?自己的想法:仔细看代码pot(2,3).X=4执行.X操作的时候这时;Point类型的值还是在局部函数的栈中,这时已从pot函数返回Point类型值可能在随后某个时间会被销毁,如果再次执行.X;这时可能Point值地址已被回收.期待您的回答是这样的:1.是自己的想法,这样可以讨论2.由于上面的想法都是根据结果猜想的,可能存在错误,片面,缺少依据;如有你的想法有理有据,有参考来源会更好
2 回答
哆啦的时光机
TA贡献1779条经验 获得超6个赞
纠正你一下,只是基本类型的字面量不能取地址,因为它们并不分配具体的内存空间。但复合类型的对象是可以取地址的。所以第一个例子没有任何问题正是你所说的原因,go的安全性做的还是可以的
添加回答
举报
0/150
提交
取消