Web3 学习:Solidity中的结构体、数组和映射

昨天跟着github上的一个开源教学项目学习了一晚,又通过视频课讲解,对solidity语言中的数据类型和存储类型有了一个基本的认知。

今天的文章主要探讨总结三个核心概念:StructArrayMapping,这是我学习到目前觉得比较难理解的概念。


1. 前两天的收获

  1. 跑通链路:创建钱包、连测试网、领测试币、部署合约、上链交易,全程验证成功。
  2. 吃透简单合约:写了个 "set 存数字、get 读数字" 的极简合约,搞懂了状态变量(链上长期存)、view 函数(纯查询不花钱)、Gas(写操作要付费)这些基础逻辑。

第三天:数据类型的学习比较轻松,虽然内容多但是都比较好理解,存储类型(storage/memory)先留个印象,虽然概念简单但是感觉底层逻辑需要进一步理解,之后再讨论。

2. Struct(结构体)

Solidity中有很多的数据类型,大多数还比较好理解,但是真实业务中,如果只用基本类型,会很散乱

Struct 的作用:把一条记录的多个字段绑在一起,给它起一个类型名字。

solidity 复制代码
struct Message {
    address sender;    // 发送者地址
    string content;    // 留言内容
    uint256 timestamp; // 发送时间
}

它有的类似一个数据模板 ------ 不管是订单、仓位还是报价,先把 "一条记录该有哪些信息" 定义清楚,后面写代码逻辑会顺很多。

心得:结构体本质上就像 Excel 里的一行。

3. Array(数组)

Struct是单条记录的模板,那么自然要解决存一批记录的问题 。

Array(数组) 的定位是有序集合。比如用刚才的 Message 模板,定义一个数组:

solidity 复制代码
Message[] public messages;

这就成了一个留言时间线,新留言直接往后面加,想查第几条,按编号就能找到。

现阶段不用深究复杂操作,记住三个核心就够:

  1. 按顺序追加 :用 push 把新记录加到数组末尾。
  2. 按下标访问 :通过索引(比如 messages[0])读某一条。
  3. 别在链上大规模遍历:遍历数组超费 Gas,复杂查询尽量放链下做。

心得 :Struct 定义单条记录长什么样 ,Array负责把一批记录按顺序排好

4. Mapping(映射)

数组适合 "按顺序存、按编号查",但很多场景其实是 "按关键词查状态":

  • 某个地址的余额是多少?
  • 某 Token 现在属于谁?
  • 某个用户发了多少条留言?

这时候 Mapping(映射) 就比数组好用多了,它像个 "键值对字典",直接按 Key 查 Value,不用翻来翻去:

solidity 复制代码
mapping(address => uint256) public balance;     // 地址 → 余额
mapping(uint256 => address) public tokenOwner;  // TokenId → 持有者
mapping(address => bool) public isWhitelisted;  // 地址 → 是否在白名单

Mapping 的关键特征用:

  1. 查得快:按 Key 直接定位,不用遍历。
  2. 有默认值:没赋值的 Key,读出来是类型默认值(数字 0、布尔 false)。
  3. 不能直接遍历:想拿所有 Key 的列表,得配合数组一起设计。

心得:mapping是这三个概念中最好理解的。

5. 核心组合:Struct + Array + Mapping 搭业务模型

这三个概念单独看都好理解,组合起来就能覆盖很多基础业务场景。

比如接下来这个区块链上的留言板:

  • struct Message:定义一条留言的字段(发送者、内容、时间)。
  • Message[] messages:存所有留言,按时间顺序排列(时间线)。
  • mapping(address => uint256) messageCount:记录每个地址发了多少条留言(查状态)。

其实很多 DeFi、NFT 协议的基础数据形态,本质都是这三块 "积木" 的组合。


小结

由于编程基础有点薄弱,昨天正式学习solidity的感觉是一下子信息量太大,很多概念理解不了或者记不住,后来发现学不会的先不学,进度就快多了。

相关推荐
Arjun3 天前
C语言基础内容整理
编程语言
怕浪猫3 天前
第19章:Go语言工具链与工程实践
后端·go·编程语言
番茄灭世神4 天前
Rust学习笔记第2篇
rust·编程语言
怕浪猫4 天前
第18章:测试与性能调优——unit test与benchmark
后端·google·编程语言
怕浪猫5 天前
第17章:反射与泛型编程——运行时能力与代码复用
后端·go·编程语言
长安牧笛7 天前
让车学会耍赖式安全停车,危险时优先靠边停车,不是硬刹,颠覆紧急制动逻辑,输出平稳停车。
python·编程语言
We....9 天前
仓颉语言入门:核心概念与基础数据类型
编程语言·仓颉·仓颉鸿蒙
FleetingLore9 天前
如何系统地推导语法系统的意外情况
编程语言
长安牧笛9 天前
车载模型白天晚上自动切换,自动切昼夜模型,颠覆统一模型,输出稳定识别。
python·编程语言
华科大胡子14 天前
《Effective C++》学习笔记:条款02
c++·编程语言·inline·const·enum·define