映射类型

  1. 映射Mapping
  2. 映射的规则
  3. 映射的原理

映射Mapping

人们可以通过键(Key)来查询对应的值(Value

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

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

映射的规则

  • 映射的_KeyType只能选择solidity默认的类型,比如uintaddress等,不能用自定义的结构体struct

  • 映射的存储位置必须是storage,因此可以用于合约的状态变量,函数中的storage变量,和library函数的参数(见例子)。不能用于public函数的参数或返回结果中,因为mapping记录的是一种关系 (key - value pair)。

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

  • 给映射新增的键值对的语法为_Var[_Key] = _Value,其中_Var是映射变量名,_Key_Value对应新增的键值对。例子:

// SPDX-License-Identifier: MIT

//声明solidity版本 这行代码意思是源文件将不允许小于 0.8.4 版本或大于等于 0.9.0 版本的编译器编译
pragma solidity ^0.8.4; 

contract HelloWeb3{
    mapping(uint => address) public idToAddress; // id映射到地址    

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

映射的原理

  • 原理1: 映射不储存任何键(Key)的资讯,也没有length的资讯。
  • 原理2: 映射使用keccak256(key)当成offset存取value。
  • 原理3: 因为Ethereum会定义所有未使用的空间为0,所以未赋值(Value)的键(Key)初始值都是0。

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。