昨天跟着github上的一个开源教学项目学习了一晚,又通过视频课讲解,对solidity语言中的数据类型和存储类型有了一个基本的认知。
今天的文章主要探讨总结三个核心概念:Struct 、Array 、Mapping,这是我学习到目前觉得比较难理解的概念。
1. 前两天的收获
- 跑通链路:创建钱包、连测试网、领测试币、部署合约、上链交易,全程验证成功。
- 吃透简单合约:写了个 "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;
这就成了一个留言时间线,新留言直接往后面加,想查第几条,按编号就能找到。
现阶段不用深究复杂操作,记住三个核心就够:
- 按顺序追加 :用
push把新记录加到数组末尾。 - 按下标访问 :通过索引(比如
messages[0])读某一条。 - 别在链上大规模遍历:遍历数组超费 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 的关键特征用:
- 查得快:按 Key 直接定位,不用遍历。
- 有默认值:没赋值的 Key,读出来是类型默认值(数字 0、布尔 false)。
- 不能直接遍历:想拿所有 Key 的列表,得配合数组一起设计。
心得:mapping是这三个概念中最好理解的。
5. 核心组合:Struct + Array + Mapping 搭业务模型
这三个概念单独看都好理解,组合起来就能覆盖很多基础业务场景。
比如接下来这个区块链上的留言板:
struct Message:定义一条留言的字段(发送者、内容、时间)。Message[] messages:存所有留言,按时间顺序排列(时间线)。mapping(address => uint256) messageCount:记录每个地址发了多少条留言(查状态)。
其实很多 DeFi、NFT 协议的基础数据形态,本质都是这三块 "积木" 的组合。
小结
由于编程基础有点薄弱,昨天正式学习solidity的感觉是一下子信息量太大,很多概念理解不了或者记不住,后来发现学不会的先不学,进度就快多了。