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);
    }
}
posted @ 2021-01-14 17:05  sorachannel  阅读(120)  评论(0)    收藏  举报