Solidity学习03 数组、结构体、映射类型
数组
创建数组的规则
// 1. 创建数组的规则
contract MyContract {
// 定长数组 动态数组
string[10] public arr1;
int256[] public arr2;
bytes public arr3;
bytes1[] public arr4;
function arr5Test() public pure {
// memory修饰的动态数组。在new的时候必须指定长度,而且后期不能变更长度
int256[] memory arr5 = new int256[](10);
arr5[10] = 10; // 会报错
}
}
方括号初始化
contract MyContract2 {
function invockSum() public pure returns (uint256 res) {
res = sum([uint256(1), 2, 3]); // 方括号初始化语法
}
function sum(uint256[3] memory _data) public pure returns (uint256 res) {
res = 0;
for (uint256 i = 0; i < _data.length; i++) {
res += _data[i];
}
}
}
数组成员变量与函数
.length():返回数组长度
.pop():移除最后一个元素(仅限动态数组)
.push(x):在最后加入一个元素(仅限动态数组)
contract MyContract3 {
int256[] public arr;
function test(int256[] calldata _data) public returns (uint256 res) {
for (uint256 i = 0; i < _data.length; i++) {
// push(x)
arr.push(_data[i]);
}
arr.pop();
res = arr.length; // 应该返回4
}
}
构造体
构造体的声明与4赋值方式
// 结构体
contract MyContract4 {
struct User {
string Name;
uint Age;
bool IsActive;
}
// 初始化结构体
User public user1;
// 结构体赋值1:直接赋值
function setUser() public {
user1.Name = "Amy";
user1.Age = 1;
user1.IsActive = false;
}
// 结构体赋值2:创建新对象赋值
// 创建storage的新对象,本质是一个对状态变量的引用
function setUserL2() public {
User storage theUser = user1;
theUser.Name = "Amy2";
theUser.Age = 10;
theUser.IsActive = false;
}
// 结构体赋值3:构造函数式
function setUserL3() public {
user1 = User("Amy3", 1, true);
}
// 结构体赋值4:显式传参
function setUserL4() public {
user1 = User({Name: "Amy4", Age: 22, IsActive: true});
}
}
映射类型
类似c#中的Dictionary类型
mapping的keytype只能是内置类型,而valuetype可以使内置类型也可以是自定义的类型。
contract MyContract5 {
struct User {
int id;
string name;
}
mapping(int => User) public idToUserMap;
function setMap() public {
User memory user1 = User(1, "Amy");
User memory user2 = User({id: 2, name: "Bob"});
idToUserMap[1] = user1;
idToUserMap[2] = user2;
}
function getUserById(int _id) public view returns (int, string memory) {
User memory user = idToUserMap[_id];
return (user.id, user.name);
}
}

浙公网安备 33010602011771号