Struct

contract Struct {
  // 定义
  struct Car {
    string model;
    uint year;
    address owner;
  }
  
  Car[] public cars;
  mapping(address => Cars[]) public userCars;
  
  function demo() external {
    // 初始化的三种方法
    Car memory bmw = Car("BMW", 2020, msg.sender); // 必须与属性顺序一致
    Car memory porsche = Car({year: 2022, model: "Porsche", address: msg.sender}); // 可以随意顺序
    Car memory tesla;
    tesla.model = "Tesla";
    // ...
  
    // memory: 复制 state 到内存, 所有修改操作不存储, 每次内部传参时都进行拷贝
    Car memory firstCar = cars[0];
    // storage: 所有操作会存回 state 保存
    Car storage firstCar = cars[0];
    // calldata: 在内部多个函数之间传参数组时使用, 该数组虽然是动态数组, 但是内容/长度不可变, 由于传参避免拷贝因而更节省 gas
  
    // 恢复默认值
    delete bmw.owner; // 属性重置
    delete cars[0]; // 所有属性重置
  }
}

Last updated

Was this helpful?