第9天:mapping、array、struct:Solidity 里最常用的数据结构

5 阅读2分钟

mapping(address => bool) public claimed;

mapping 最适合干什么

最适合:

  • 查某个地址是否在白名单
  • 查某个地址余额是多少
  • 查某个用户是否已领取
  • 查某个地址对应什么配置

function addUsers(address[] calldata users) external { ... }

array 最适合干什么

最适合:

  • 记录一个列表
  • 保存一批地址
  • 保存一批数字
  • 做批量处理输入
  • 需要按顺序遍历

例如:

  • 白名单地址列表
  • 活动参与地址列表
  • 某个用户提交的一批 ID
  • 函数传入的一组地址

struct UserInfo {

uint256 score;

bool claimed;

uint256 joinedAt;

}

struct 最适合干什么

最适合表示:

  • 用户信息
  • 订单信息
  • 提案信息
  • 活动配置
  • 某条完整记录

也就是说:

当你描述的不是一个单值,而是一整个对象时,就很适合用 struct。

struct UserClaimInfo {

uint256 score;

bool claimed;

uint256 rewardAmount;

}

mapping(address => UserClaimInfo) public userInfo;

UserClaimInfo[] public users;

1

mapping 最直观的理解是什么?

参考方向:key -> value 的映射表。

2

为什么 mapping(address => bool) 很适合表示“是否已领取”?

参考方向:拿地址一查,就知道 true/false。

3

array 最适合表示哪类数据?

参考方向:一组同类型、有顺序、可遍历的数据。

4

为什么“参与者列表”比“是否已领取”更适合 array?

参考方向:因为它强调一组地址列表,而不是单个 key 查询。

5

struct 最适合解决什么问题?

参考方向:把多个字段打包成一条完整记录。

6

为什么 struct UserInfo { score; claimed; } 比零散变量更清晰?

参考方向:因为用户信息被组织成一个整体对象。

7

mapping(address => UserInfo) 表达的是什么关系?

参考方向:每个地址对应一条用户信息记录。

8

真实合约里,这三种结构能不能组合用?

参考方向:能,而且很常见。

9

为什么选对数据结构会影响合约设计?

参考方向:因为它影响可读性、查询方式、状态组织方式,进而影响实现难度和成本。