持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
数组和结构体的声明
数组声明
如果我们需要存储大量的变量,肯定不能一个个结构体的声明,这时候就需要引出数组的概念,数组一般用[]表示,如果我们需要一个People类的数组,存储大量的人员,那么声明如下
People[] public peoples;
这种声明方式是动态数组的声明,不确定大小。如果需要固定大小只需要在[3]里加入需要的大小限制就可以。
结构体声明
solidity中的结构体跟java中的类,go里面的结构体是差不多的意思,关键字stuct,如下我们声明一个People的结构体。
struct People {
uint256 favouriteNumber;
string name;
}
定义好结构体以后,我们就可以在合约内部声明使用了。
如 People public people =People({favouriteNumber:20,name:"jouy"});
数组的使用
声明了数组,那么我们应该编写我们的函数,来往里面存储,可以编写一个函数来做这个事
function addPerson(string memory _name, uint256 _favoriteNumber) public {
peoples.push(People(_favoriteNumber, _name));
}
每次调用addPerson方法就能往我们的数组里面存储一个值。这里注意到函数里有个memory关键字,它表示,这个数组的位置是在内存里的,是可以修改的临时变量。
那么这里可能会有疑问,为什么数组的变量要声明memory,uint类型不用? 因为方法需要为数组指定数据位置,结构或映射类型。字符串也是一个数组,我们需要添加内存位。 而uint256 solidity自动知道你在256中的位置,但不确定字符串会在什么地方。
变量的存储
storage:变量是指永久存储在区块链中的变量。
memory:变量是临时的, 外部函数对某合约调用完成的时候。
映射的使用
我们虽然往数组里存储了很多数据,但是当我们想知道某一个人的数据的时候就没法快速定位了。因此出现映射,类似于js中的map,即一个key-value对应的值,关键字 是mapping。
mapping(string => uint256) public nameToFavoriteNumber;
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.7;//0.8.12
contract SimpleStorage {
uint256 public favouriteNumber;
People[] public peoples;
mapping(string => uint256) public nameToFavoriteNumber;
People public people =People({favouriteNumber:20,name:"jouy"});
struct People {
uint256 favouriteNumber;
string name;
}
function store(uint256 _favoriteNumber) public{
favouriteNumber=_favoriteNumber;
}
function addPerson(string memory _name, uint256 _favoriteNumber) public {
peoples.push(People(_favoriteNumber, _name));
nameToFavoriteNumber[_name] = _favoriteNumber;
}
function retrieve() public view returns(uint256){
return favouriteNumber;
}
}
如图部署好一个一个合约用来测试我们的数组结构体和映射,如下
如图先调用addPerson往数组存储数组和映射,然后想查询对应name的值,就可以直接点击对应变量,输入参数,返回正确的值。
总结
本文主要介绍了solidity中数组、结构体、映射三种类型的使用,合约中的这几个知识点都挺重要的,因为书写合约少不了要用上,是一个必须掌握的知识。