各编程语言的值语义和引用语义的区别详解(golang,c++,php,solidity) - Go语言中文社区

各编程语言的值语义和引用语义的区别详解(golang,c++,php,solidity)


最近在使用 solidity(以太坊ethereum的智能合约的语言)的语言的时候,发现一些问题,

只要是solidity语言中array和struct类型在storage和memory情况下的引用语义的理解问题

另外对于不同语言的引用语义的理解其实是不一样的,这一点对于新人来说就比较坑~

对于值语义,各个语言没有差别的,这个很好理解

但是对于引用语义,这里以c++和php中的引用类型中的意义为准;php的对象和golang中引用类型,其实是有区别的,这里我自己用了个名字来表示“指针语义”

现在梳理总结如下

值语义:

变量赋值后,两个变量拥有的存储空间是独立的,相互之间不影响

引用语义:

变量引用赋值后,两个变量只有一份的存储空间,相互之间可以理解为是别名,操作任意一个变量,就可以认为是操作另外一个变量,效果完全一样

c++里面的引用类型,php里面的引用类型,都是这样的,不过他们还是有稍微区别(php里面可以重新引用复制,这样两个变量又没有关系了)

指针语义:

拿 golang 里面 slice 来举例吧(map,chan也类似)

变量赋值后,比如 b:=a,数据存储如下

 

就是a和b都有自己对应的存储空间,存储的是一个struct,里面有一个指针,他们的值是相同的,这个指针都指向同一块底层数据

所以对于a或者b进行底层数据的修改来说,两者是互相影响的,比如a[0]=1, 这个是相当于作用于底层市局data

但是若是直接修改a或者b,比如a=[]int{},那么就相当于a对应的struct的值变了,里面的指针p变了之后,就相当于指向了另外一个data。这个时候a和b之间的操作就没有关系了

属于这种类型的有golang里面的slice,map,chan,interface;php里面的class对象

可以发现,这种情况非常类似于c++里面的指针的效果,所以这里就叫做“指针语义”吧

 

话说回来,对于solidity语言的变长array和struct类型来说(官方手册里面把这个都称之为引用类型)来说,

 

  1. 如果是storage的话,就属于引用语义(存疑,不清楚当初为什么这么写了,最近写代码的时候发现,其实是指针语义的)
  2. 如果是memory的话,就属于是指针语义

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/liangzhiyang/article/details/79530364
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-05-07 22:25:47
  • 阅读 ( 1927 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢