结构体
Remix 测试
状态变量两种初始化
Data public _data0 = Data(123, 456, true);
Data public _data1 = Data({
tokenId: 123,
price: 456,
state: true
});
Gas消耗对比
各initialize函数传参不同。
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract TestStruct {
struct Data {
uint256 tokenId;
uint256 price;
bool state;
}
mapping(uint256 => Data) public Datas;
Data public _data0 = Data(123, 456, true);
Data public _data1 = Data({tokenId: 123, price: 456, state: true});
constructor() {}
//88271 gas
function initialize(uint256 tokenId) external {
Datas[tokenId] = Data(tokenId, 123, true);
}
//88158 gas
function initialize1(uint256 tokenId) external {
Data storage data = Datas[tokenId];
data.tokenId = tokenId;
data.price = 123;
data.state = true;
}
//88302 gas
function initialize2(uint256 tokenId) external {
Datas[tokenId].tokenId = tokenId;
Datas[tokenId].price = 123;
Datas[tokenId].state = true;
}
//88579 gas
function initialize3(uint256 tokenId) external {
Data memory data = Datas[tokenId];
data.tokenId = tokenId;
data.price = 123;
data.state = true;
Datas[tokenId] = data;
}
}
initialize1 | 88158 gas |
---|---|
initialize | 88271gas |
initialize2 | 88302 gas |
initialize3 | 88579 gas |
(初始化或更新)建议
先声明storage变量,接收状态变量。
Data storage data = Datas[tokenId];
data.tokenId = tokenId;