Skip to content

Latest commit

 

History

History
42 lines (32 loc) · 1.81 KB

File metadata and controls

42 lines (32 loc) · 1.81 KB

101-07 映射类型 mapping

在映射中,人们可以通过键(key)来查询对应的值(value),比如:通过一个人的ID来查询他的钱包地址.

映射

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

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

映射的规则

  1. 映射的_KeyType只能选择Solidity内置的值类型,比如uint,address等,不能用自定义的结构体。而_ValueType可以使用自定义的类型。
/*
    struct Student{
        uint256 id;
        uint256 score;
    }

    mapping (Student => uint) public testVar;
*/
    //上方代码报错是因为_KeyType使用了自定义结构体
  1. 映射的存储位置必须是storage,因此可以用于合约的状态变量,函数中的storage变量和library函数的参数.不能用于public函数的参数或返回结果中,因为mapping记录的是一种关系 (key-value pair)。

  2. 如果映射声明为public,那么Solidity会自动给你创建一个getter函数,可以通过Key来查询对应的Value。

  3. 给映射新增的键值对的语法为_Var[ _Key ] = _Value,其中_Var是映射变量名,_Key和_Value对应新增的键值对。

function writeMap (uint _Key, address _Value) public{
    id2Address[_Key] = _Value;
}

映射的原理

  1. 映射不储存任何键(key)的咨询,也没有lengh的资讯
  2. 映射使用keccak256(abi.encodePacked(key,slot))当成offset存取value,其中slot是映射变量定义所在的插槽位置
  3. 因为Ethereum会自定义所有未使用的空间为0,所以未赋值(value)的键(Key)初始值都是各个type的默认值,如uint的默认值都是0.