← 返回博客
WEB32023-08-14 17:09:34 1806

Solidity 复杂数据类型示例

本文介绍了在 Solidity 合约中使用复杂数据类型的示例。通过一个实际的合约案例,演示了如何定义结构体、操作数组,以及如何获取调用者和合约的地址。此外,还展示了如何使用固定大小的字节数组。通过这个示例,读者可以更好地理解 Solidity 合约中复杂数据类型的使用方法。

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 合约中的复杂数据类型的使用,帮助您更好地理解如何在合约中存储和操作结构体、数组等复杂数据。

相关推荐