【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评论