【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;
    }
}

Loading

Facebook评论