###mapping的使用特性
mapping是用来保存键值对的,其书写方式与一般的编程语言有些不同,mapping(keyType => valueType)。mapping只能使用在合约的状态变量中,或者在函数内进行storage的引用,如var storage mappVal的用于存储状态变量的引用的对象,不能使用非状态变量来初始化这个引用,也就是mapping最终会保存在区块链上的,不可能是内存型变量。
1 | pragma solidity >=0.4.0 <0.6.0; |
- mapping的key可以使用除了mapping类型以外的所有类型,value没有任何限制。
- mapping实际上并不存储key的值,而是把key转换成keccak256的哈希值进行存储,所以通过mapping是无法获取保存的key的。
- mapping只能用来定义状态变量,如果要在函数内部使用的话,则也需要将其声名为一个storage类型的引用,引用指向的是还是状态变量。
###CURD操作 - 增加元素,比如kvs[1] = “a”。
- 更新元素,和增加一样,只不过key已经存在了。
- 查找元素,比如string memory a = kvs[1]。
- 删除元素,使用关键delete,比如delete kvs[1]。注意delete操作修改的是状态变量,所以会有gas的消耗,一般不会轻易的delete元素的。
###遍历
上边已经知道mapping是不保存key的值的,所以无法进行mapping的直接遍历。但是如果把key保存下来不就可以进行遍历了吗。其具体实现可以看这个工具包,是将key保存到一个不固定长度的数组中,所以你在插入元素的时候也需要使用这个工具包的插入方法。