如何在不使用 for 循环的情况下在 Solidity 中获取数组数据

如何在不使用 for 循环的情况下在 Solidity 中获取数组数据

您是否发现自己在为智能合约中大型数组读取数据的效率而苦恼?好吧,不要害怕我的 Solidity 爱好者,因为我有一个绝招!

从 Solidity 中的数组读取数据可能是一个资源消耗过程,尤其是在处理数千个元素时。这可能会导致请求被节点取消,这可能会让开发人员头疼。然而,还有另一种方法可以做到这一点——不使用 for 循环!

在传统的简单方法中,您将使用 for 循环从数组中检索所有数据。但这可能效率低下且耗时。

传统方式

pragma solidity ^0.8.0;

contract MyContract {
    uint[] private myArray;

    function getAllData() public view returns (uint[] memory) {
        uint[] memory result = new uint[](myArray.length);

        for (uint i = 0; i < myArray.length; i++) {
            result[i] = myArray[i];
        }

        return result;
    }
}

那么,我们如何在不使用 for 循环的情况下从数组中检索所有数据呢?其实很简单。

我们的方式

首先,创建一个结构,其中包含您要检索的数据类型的数组。在这个例子中,我们将使用地址:

contract MyContract {
    struct Addresses {
        address[] addresses;
    }
}

接下来,声明结构的私有变量实例。

Addresses private addressVar;

向数组中添加数据,直接push地址即可

function addAddress(address _address) external {
    addressVar.addresses.push(_address);
}

现在是诀窍——要在不使用 for 循环的情况下从数组中检索所有数据,只需将声明的结构作为函数的返回类型传递,并使用 memory 关键字指定它将存储在内存中。

function getAddresses() external view returns (Addresses memory) {
    return addressVar;
}

在返回值中,您将获得一个地址元组。不需要 for 循环!这种方法可以节省 gas 成本并使您的代码更高效。

contract practice{
    struct Addresses{
        address[] addresses;
    }
    Addresses private addressVar;
    function addAddress(address _address) external{
        addressVar.addresses.push(_address);
    }
    function getAddresses() external view returns(Addresses memory){
        return addressVar;
    }
}

通过Github 获取更多区块链学习资料!

https://github.com/Manuel-yang/BlockChainSelfLearning

猜你喜欢

转载自blog.csdn.net/qq_23351293/article/details/130307553