3分钟Solidity: 4.1 数据定位 - Storage, Memory and Calldata

0 阅读1分钟

如需获取本内容的最新版本,请参见 Cyfrin.io 上的“数据定位——Storage, Memory and Calldata(代码示例)”

变量被声明为storage、memory或calldata,以明确指定数据的位置。

  • storage - 变量是状态变量(存储在区块链上)
  • memory - 变量在内存中,仅在函数被调用时存在
  • calldata - 包含函数参数的特殊数据位置
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

contract DataLocations {
    uint256[] public arr;
    mapping(uint256 => address) map;

    struct MyStruct {
        uint256 foo;
    }

    mapping(uint256 => MyStruct) myStructs;

    function f() public {
        // 调用带有状态变量的 _f
        _f(arr, map, myStructs[1]);

        // 从映射中创建storage结构体
        MyStruct storage myStruct = myStructs[1];
        // 创建一个memory结构体
        MyStruct memory myMemStruct = MyStruct(0);
    }

    function _f(
        uint256[] storage _arr,
        mapping(uint256 => address) storage _map,
        MyStruct storage _myStruct
    ) internal {
        // 处理storage
    }

    // 您可以返回memory变量
    function g(uint256[] memory _arr) public returns (uint256[] memory) {
        // 对memory数组进行操作
    }

    function h(uint256[] calldata _arr) external {
        // 操作 calldata 数组
    }
}

Remix Lite 尝试一下

solidity-数据定位


END