// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.3;
contract Structs {//结构体是能够将多种变量格式打包一起的数据格式,以一种类型的形式存在
struct Car {
string model;//默认值字符串
uint year;//默认值0
address owner;//默认值 0地址
}
//以下三种都是声明状态变量方法,会记录在链上
Car public car;//结构体是大写字母开头,变量是小写字幕开头
Car[] public cars;
mapping(address => Car[]) public carsByOwner;//结构体类型定义一个映射,代表一个人可能拥有许多辆汽车,
function examples() external {//函数中声明局部变量,运行在内存中;合约/方法调用完后就消失
Car memory toyota = Car("Toyota", 1990, msg.sender);//向结构体传入数据的写法,,必须按照顺序
Car memory lambo = Car({year: 1980, model: "Lamborghini", owner: msg.sender});//定义了名称就可以调转顺序去定义值
Car memory tesla;//
tesla.model = "Tesla";
tesla.year = 2010;
tesla.owner = msg.sender;
cars.push(toyota);//数组方法push变量推入到结构体
cars.push(lambo);
cars.push(tesla);
cars.push(Car("Ferrari", 2020, msg.sender));//推入定义一步完成,同样是在内存中建立的结构体,推入数组中,推入后进入到一个状态变量中而不是局部变量
//Car memory _car = cars[0];//获取结构体的值,要将变量装入到内存中,内存中不能修改删除
Car storage _car = cars[0];//定义在存储中就可以对结构体的值进行增删改查,存储就是把状态变量读取出来,且带有指针式的读取
_car.year = 1999;
delete _car.owner;
delete cars[1];//索引为1的结构体三个变量的值就会变为默认值
}
}