【Solidity】数据位置memory, storage, calldata解析
目前,引用类型包括string、struct、array和mapping,使用引用类型必须明确地提供存储该类型的数据位置(memory、storage或calldata)
memory:生存期存在于function内,超过作用域即失效
storage:生存期同contract(合约)一致,状态变量强制为storage,数据保存合约内
calldata:不可修改、非持久的function参数存储区域,用于存储function参数,只读,不会永久存储一个数据位置,效果类似memory, 非常推荐在function参数内使用,可以省gas
如果有学过golang的同学,storage有点类似于指针的功能,你赋值给新的variable,就算是新variable有更改,但是最终会反映在原有的variable当中,并且把数据存入合约中。
代码范例
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract Demo{
//范例1:一般string的使用方式
string public name = "aaa";
function changeName(string calldata newName) public returns(string memory){
name = newName;
return name;
}
//范例2:结合struct,使用storage的方式,把汽车的牌子给更改
struct car{
string brand;
uint year;
}
car[] public cars;
function addCar()public{
cars.push(car({brand:"Toyota",year:2008}));
cars.push(car({brand:"Honda",year:2018}));
cars.push(car({brand:"Nissan",year:2011}));
}
function changeCarBrand(uint _index, string calldata newBrand) public {
car storage tempCar = cars[_index];
tempCar.brand = newBrand;
}
}
![]()
Facebook评论