数组
声明
type arrayName [ arraySize ];
eg:
uint balance[10];
初始化
uint balance[3] = [uint(1), 2, 3];
数组成员
- length
- push
内存数组
可以使用 new 关键字在内存中创建动态数组。与存储数组相反,不能通过设置 .length 成员来调整内存动态数组的长度。
// SPDX-License-Identifier: SimPL-3.0
pragma solidity ^0.7.0;
contract C {
function f(uint len) {
uint[] memory a = new uint[](7);
bytes memory b = new bytes(len);
// a.length == 7, b.length == len
a[6] = 8;
}
}
结构体
// SPDX-License-Identifier: SimPL-3.0
pragma solidity ^0.7.0;
contract test {
struct Book {
string title;
string author;
uint book_id;
}
Book book;
function setBook() public {
book = Book('Learn Java', 'codebaoku.com', 1);
}
function getBookAuthor() public view returns (string memory) {
return book.author;
}
}
映射
mapping(_KeyType => _ValueType)
- _KeyType:可以是任何内置类型,或者 bytes 和 字符串。不允许使用引用类型或复杂对象。
- _ValueType: 可以是任何类型。
映射可以视作哈希表 ,它们在实际的初始化过程中创建每个可能的 key,并将其映射到字节形式全是零的值:一个类型的 默认值。然而下面是映射与哈希表不同的地方:在映射中,实际上并不存储 key,而是存储它的 keccak256 哈希值,从而便于查询实际的值。
正因为如此,映射是没有长度的,也没有 key 的集合或 value 的集合的概念。映射只能是存储的数据位置,因此只允许作为状态变量或作为函数内的存储引用 或 作为库函数的参数。 它们不能用合约公有函数的参数或返回值。
可以将映射声明为 public,然后来让 Solidity 创建一个 getter 函数。 _KeyType 将成为 getter 的必须参数,并且 getter 会返回 _ValueType。