Solidity中mapping如何初始化?声明时初始化的最佳实践是什么
Solidity mapping类型初始化的常见错误与最佳实践
你写的代码报错有三个核心原因:
- Solidity 中mapping类型不支持声明时直接用字面量的方式赋值初始化,你用的
[键: 值, 键: 值]语法只适用于数组和结构体字面量,对mapping无效。 - 语法使用错误:
view是函数修饰符,仅用于标记不修改链上状态的函数,不能用来修饰状态变量,状态变量仅支持public/internal/private三种可见性修饰符。 - 地址字面量格式错误:合法的Solidity地址必须是
0x开头的42位十六进制字符串,你写的addr-1、addr-2不符合语法规范。
最佳实践
如果需要在合约部署阶段就给mapping设置初始值,统一在合约构造函数中赋值即可,这是目前Solidity官方推荐的标准写法,示例代码如下:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract DemoContract { // 仅声明mapping,不做初始化赋值 mapping(address => bool) public myMap; // 构造函数在合约部署时自动执行 constructor() { // 逐一给需要初始化的键赋值 myMap[0x5B38Da6a701c568545dCfcB03FcB875f56beddC4] = true; myMap[0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2] = false; myMap[0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db] = true; } }
如果需要初始化的键值对数量较多,或者需要在部署后再更新初始值,也可以额外写一个仅管理员可调用的初始化方法,批量给mapping赋值。
额外提示:Solidity的mapping属于稀疏映射,所有未被手动赋值的键都会自动返回对应值类型的默认值(比如bool类型默认返回false,uint类型默认返回0,地址类型默认返回零地址),无需手动给所有可能的键设置初始值。
内容的提问来源于stack exchange,提问作者johnDoe
相关产品推荐
相关产品推荐

