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
为什么选对数据结构会影响合约设计?
参考方向:因为它影响可读性、查询方式、状态组织方式,进而影响实现难度和成本。