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的感觉是一下子信息量太大,很多概念理解不了或者记不住,后来发现学不会的先不学,进度就快多了。

相关推荐
大熊猫侯佩1 天前
Swift 迭代三巨头(下集):Sequence、Collection 与 Iterator 深度狂飙
swift·编程语言·apple
大熊猫侯佩1 天前
Swift 迭代三巨头(中集):Sequence、Collection 与 Iterator 深度狂飙
swift·编程语言·apple
大熊猫侯佩1 天前
Swift 迭代三巨头(上集):Sequence、Collection 与 Iterator 深度狂飙
swift·编程语言·apple
图形学爱好者_Wu1 天前
每日一个C++知识点|多线程基础
c++·编程语言
文攀3 天前
Go 语言 GMP 调度模型深度解析
后端·go·编程语言
大熊猫侯佩4 天前
代码危机:梅根的内存救赎(上) ——Swift Task 中的 [weak self] 终极解密
swift·编程语言·apple
大熊猫侯佩4 天前
Swift 6.2 列传(第十篇):李莫愁的双绝解毒术 —— 隔离舱与即时刃
swift·编程语言·apple