Solidity 合约中的复杂数据类型示例
在 Solidity 合约中,除了基本数据类型外,还支持复杂数据类型,如结构体和数组。以下是一个示例合约,展示了如何使用结构体、数组和其他数据类型。
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.8.2 <0.9.0;
contract ComplexValueType {
// 定义结构体
struct Person {
string name;
uint age;
}
// 存储结构体数组
Person[] public people;
// 添加结构体到数组
function addPerson(string memory _name, uint _age) public {
people.push(Person(_name, _age));
}
// 获取指定索引的结构体
function getPerson(uint _index) public view returns (string memory, uint) {
Person memory p = people[_index];
return (p.name, p.age);
}
// 获取整个结构体数组
function getPeople() public view returns (Person[] memory) {
return people;
}
// 获取结构体数组的长度
function getPeopleCount() public view returns (uint) {
return people.length;
}
// 获取调用者的地址
function getAddress() public view returns (address) {
return msg.sender;
}
// 获取合约的地址
function getContractAddress() public view returns (address) {
return address(this);
}
// 获取合约的地址(另一种方式)
function testContract() public view returns (address) {
// 使用 contract 类型的变量获取本合约的地址
ComplexValueType myContract = this;
address myAddress = address(myContract);
return myAddress;
}
// 示例:固定大小字节数组
function testFixedByteArray() public pure returns (bytes1) {
bytes3 b3 = 0x111111;
bytes1 b1 = b3[0];
return b1;
}
}
在上述示例合约中,我们使用了结构体 Person 来存储人员的姓名和年龄。我们还演示了如何向结构体数组添加人员信息、获取人员信息、获取结构体数组长度等操作。此外,还展示了如何获取调用者的地址、合约的地址,以及如何使用固定大小的字节数组。
这个示例合约展示了 Solidity 合约中的复杂数据类型的使用,帮助您更好地理解如何在合约中存储和操作结构体、数组等复杂数据。