以太坊智能合约开发:Solidity语言中的映射

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

基本概念

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

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

声明语法

映射的定义语法如下:

mapping(key => value) <access specifier> <name>;

例如:

mapping(address => uint) public balances;

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

合约例子

例子1

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

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

// 映射
contract Mapping {
    // address => uint
    mapping(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: MIT
pragma solidity ^0.8.13;

// 嵌套映射
contract MappingNested {
    // address => mapping
    mapping(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中编译、部署和运行上面的合约例子,执行结果如下图:

在这里插入图片描述

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇

)">
下一篇>>