Solidity编程语言(9)--mapping

###mapping的使用特性
mapping是用来保存键值对的,其书写方式与一般的编程语言有些不同,mapping(keyType => valueType)。mapping只能使用在合约的状态变量中,或者在函数内进行storage的引用,如var storage mappVal的用于存储状态变量的引用的对象,不能使用非状态变量来初始化这个引用,也就是mapping最终会保存在区块链上的,不可能是内存型变量。

1
2
3
4
5
6
7
8
9
10
11
12
pragma solidity >=0.4.0 <0.6.0;

contract EgMapping{
mapping(uint => string) public kvs;

function put () public{
kvs[1] = "a";
kvs[2] = "b";
mapping(uint => string) storage kvs1 = kvs;
string memory a = kvs[1];
}
}
  1. mapping的key可以使用除了mapping类型以外的所有类型,value没有任何限制。
  2. mapping实际上并不存储key的值,而是把key转换成keccak256的哈希值进行存储,所以通过mapping是无法获取保存的key的。
  3. mapping只能用来定义状态变量,如果要在函数内部使用的话,则也需要将其声名为一个storage类型的引用,引用指向的是还是状态变量。
    ###CURD操作
  4. 增加元素,比如kvs[1] = “a”。
  5. 更新元素,和增加一样,只不过key已经存在了。
  6. 查找元素,比如string memory a = kvs[1]。
  7. 删除元素,使用关键delete,比如delete kvs[1]。注意delete操作修改的是状态变量,所以会有gas的消耗,一般不会轻易的delete元素的。
    ###遍历
    上边已经知道mapping是不保存key的值的,所以无法进行mapping的直接遍历。但是如果把key保存下来不就可以进行遍历了吗。其具体实现可以看这个工具包,是将key保存到一个不固定长度的数组中,所以你在插入元素的时候也需要使用这个工具包的插入方法。