Solidity映射类型

映射Mapping

在映射中,可以通过健(Key)来查询对应的值(Value),比如:通过一个人的id来查询他的钱包地址。

映射的声明格式为mapping(_KeyType => _ValueType),其中_KeyType和_ValueType分别是Key和Value的变量类型。例子:

    mapping(uint => address) public idToAddress; // id映射到地址
    mapping(address => address) public swapPair; // 币对的映射,地址到地址

映射的规则

  1. 映射的_KeyType只能选择Solidity默认的蕾西,不日uint、address等,不能使用自定义的结构体。而_ValueType可以使用自定义的类型。比如下面的例子就会报错,因为_KeyType使用了我们自定义的结构体:
    // 我们定义一个结构体 Struct
    struct Student{
        uint256 id;
        uint256 score; 
    }
     mapping(Student => uint) public testVar;
  1. 映射的存储位置必须是storage,因此可以用于合约的状态变量,函数中的storage变量,和library函数的参数。不能用于public函数的参数或返回结果中,因为mapping记录的是一种关系。
  2. 如果映射声明为public,那么Solidity会自动创建一个getter函数,可以通过Key来查询对应的Value。
  3. 给映射新增键值对的语法为_Var[Key] = _Value,其中_Var是映射变量名,_Key和_Value对应新增的键值对,例子:
    function writeMap (uint _Key, address _Value) public{
        idToAddress[_Key] = _Value;
    }

映射的原理

  1. 映射不存储任何健(Key)的信息,也没有length的信息。
  2. 映射使用keccak256(key)当成offset存取value。
  3. 因为Ethereum会定义所有未使用的空间为0,所以未赋值(Value)的键(Key)初始值都是各个type的默认值,如uint的默认值是0。