本文我们介绍Solidity语言中的映射,包括映射的基本定义、语法、映射的变量声明和基本读写操作。并且通过两个智能合约例子演示了映射的定义与基本操作。

基本概念

Solidity中关于映射的一些定义:

  • 映射以键-值对(key => value)的形式存储数据;
  • 键可以是任何内置数据类型,包括字节和字符串类型,但不允许引用类型,如数组、结构体和映射;
  • 值可以是任何数据类型,包括另一个映射或数组;
  • 映射是不可迭代的,即无法通过遍历映射来枚举所有的键;
  • 映射通常用于将唯一的以太坊地址与值类型关联起来。

声明语法

映射的定义语法如下:

mapping(key => value);

例如:

mapping(address => uint) public balances;

以上代码声明了一个从 address 类型到 uint 类型的映射,可见性权限是 public,名称为 balances

合约例子

例子1

演示映射的定义,基本的数据添加和读取操作。

// SPDX-License-Identifier: MITpragma solidity ^0.8.13;// 映射contract Mapping {// address => uintmapping(address => uint) public map;// 取值function get(address _addr) public view returns(uint) {// 如果值未设置,则返回默认值return map[_addr];}// 设置function set(address _addr, uint i) public {map[_addr] = i;}// 删除function remove(address _addr) public {// 删除不改变数据长度delete map[_addr];}}

输出:我们在Remix中编译、部署和运行上面的合约例子,执行结果如下图:

例子2

一个嵌套映射的例子,映射的值为另一个映射。

// SPDX-License-Identifier: MITpragma solidity ^0.8.13;// 嵌套映射contract MappingNested {// address => mappingmapping(address => mapping(uint => bool)) public map;// 取值function get(address _addr, uint _i) public view returns(bool) {// 如果值未设置,则返回默认值return map[_addr][_i];}// 设置function set(address _addr, uint _i, bool _boo) public {map[_addr][_i] = _boo;}// 删除function remove(address _addr, uint _i) public {// 删除不改变数据长度delete map[_addr][_i];}}

输出:我们在Remix中编译、部署和运行上面的合约例子,执行结果如下图: