如需获取本内容的最新版本,请参见 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 尝试一下
END