使用语法 mapping(keyType => valueType) 创建映射。
keyType 可以是任何内置值类型、字节数组、字符串或任何合约。
valueType 可以是任何类型,包括另一个映射或数组。
映射不可迭代。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
contract Mapping {
// 地址到整数的映射
mapping(address => uint) public myMap;
scss
Copy code
function get(address _addr) public view returns (uint) {
// 映射始终返回一个值。
// 如果该值从未设置过,它将返回默认值。
return myMap[_addr];
}
function set(address _addr, uint _i) public {
// 更新此地址的值
myMap[_addr] = _i;
}
function remove(address _addr) public {
// 将该值重置为默认值。
delete myMap[_addr];
}
}
contract NestedMapping {
// 嵌套映射(从地址到另一个映射)
mapping(address => mapping(uint => bool)) public nested;
scss
Copy code
function get(address _addr1, uint _i) public view returns (bool) {
// 即使未初始化,也可以从嵌套映射中获取值
return nested[_addr1][_i];
}
function set(address _addr1, uint _i, bool _boo) public {
nested[_addr1][_i] = _boo;
}
function remove(address _addr1, uint _i) public {
delete nested[_addr1][_i];
}
}
代码术语解释:
映射是 Solidity 中一种数据结构,用于将一个类型的值映射到另一个类型的值。
keyType 可以是任何内置值类型、字节数组、字符串或任何合约,valueType 可以是任何类型,包括另一个映射或数组。
映射是非迭代的,不能像数组一样通过下标访问所有元素。
通过在映射中使用 delete 可以将值重置为默认值。默认值取决于 valueType 的类型,通常为 0 或 false。
嵌套映射是将映射嵌套在另一个映射中的方式。可以使用嵌套映射来实现多维映射。
Solidity中的映射(Mapping)支持以下类型
可以作为键类型(keyType):
- 值类型(Value Types):布尔(bool)、整型(int/uint)、地址(address)、字节(byte)
- 引用类型(Reference Types):字符串(string)、定长字节数组(bytes1到bytes32)
- 枚举类型(Enums)
- 其他映射(Mappings)是不允许的。映射本身不能作为键。
映射的值类型(valueType)可以是任意类型,包括:
- 值类型:布尔、整型、地址、字节等
- 引用类型:字符串、字节数组、数组、结构体等
- 映射类型
- 枚举类型
- 其他合约类型
- 接口类型
同时注意:
映射本身不能作为键类型,但可以作为值类型
例如:
// 字符串作为键
mapping (string => uint) public balances;
// 字节数组作为键
mapping (bytes32 => address) public usernames;
// 枚举类型作为键
enum Status {Active, Inactive}
mapping (Status => uint) public statusCounts;
同样 Mapping也可以使用嵌套方式
mapping (key1 => mapping (key2 => value2)) public nested;
这里key1
和key2
都是键类型,value2
是值类型。
这样我们就可以通过nested[key1][key2]
的方式访问最内层的映射值。
contract NestedMapping {
mapping(address => mapping(uint => bool)) public nested;
//将地址和另一个Mapping进行匹配
function get(address _addr1, uint _i) public view returns (bool) {
// 可以从嵌套映射中获取值
// 即使未初始化
return nested[_addr1][_i];
}
function set(address _addr1, uint _i, bool _boo) public {
nested[_addr1][_i] = _boo;
}
function remove(address _addr1, uint _i) public {
delete nested[_addr1][_i];
}
}
例如:
mapping (address => mapping (uint => bool)) public nested;
function set(address _addr, uint _id, bool _boo) public {
nested[_addr][_id] = _boo;
}
function get(address _addr, uint _id) public view returns (bool) {
return nested[_addr][_id];
}
//这里我们把地址映射到另一个从uint到bool的映射。
//set函数可以设置内层映射的值,get函数可以读取内层映射的值。
//这样的嵌套映射结构可以用来存储更复杂的数据,如用户地址到该用户的多个状态ID。