总结Solidity 的数据类型
数据类型
在 Solidity 中,类型系统非常丰富,主要分为 值类型(Value Types)和 引用类型(Reference Types)。此外,还有一些特殊类型和全局变量。
一.值类型
布尔型(bool)
bool isActive = true;
二. 整数型(int/uint)
int
:带符号整数(可以是负数),uint
:无符号整数(只能是非负数)- 指定位宽:
int8
到int256
(步长为 8 位),默认int
等于int256
- 同理,
uint
默认等于uint256
int256 minValue = -1000;
uint256 maxValue = 1000;
三. 地址类型(address 和 address payable)
可以使用 balance
属性查询地址的余额,并使用 transfer
函数向可支付地址发送以太币(以 wei 为单位)
address payable x = payable(0x123);
address myAddress = address(this);
if (x.balance < 10 && myAddress.balance >= 10) x.transfer(10);
固定长度字节数组(bytes1 到 bytes32)
bytes32 data = "hello";
动态字节数组(bytes 和 string)
//bytes:动态长度的字节数组,适合存储任意二进制数据
//string:动态长度的 UTF-8 字符串
bytes dynamicData = "Hello";
string greeting = "Hello, World!";
枚举(enum)
enum Status { Pending, Shipped, Accepted, Rejected, Canceled }
Status public currentStatus = Status.Pending;
函数类型(function)
//分为 internal 和 external,表示合约内外的函数调用方式。
function add(uint a, uint b) public pure returns (uint) {
return a + b;
}
二.引用类型(Reference Types)
引用类型的数据存储在内存(Memory)或存储(Storage)中,传递时是「引用传递」,改变值会影响原数据。
数组(Array)
- 固定长度数组:
uint[5] arr;
- 动态长度数组:
uint[] dynamicArr;
- 可以使用
push()
、pop()
、length
等方法操作。
uint[] numbers;
numbers.push(1);
结构体(Struct)
自定义数据结构,用于封装多种类型的变量
struct Person {
string name;
uint age;
}
Person public person = Person("Alice", 30);
映射(Mapping)
类似哈希表,key
映射到 value
,key
可以是任何基本类型,但 value
可以是任意类型。
mapping(address => uint) public balances;
存储位置(Data Location)
memory
:函数调用时使用的临时内存,函数返回后即丢弃。storage
:合约的持久存储,状态变量默认是storage
。calldata
:函数的参数存储在calldata
中,无法修改,节省 Gas 费。
三、特殊类型和全局变量
合约类型(Contract)
可以定义合约类型,支持合约之间的交互。
contract MyContract {
function greet() public pure returns (string memory) {
return "Hello!";
}
}
全局变量
提供区块链信息和交易信息:
msg.sender
:调用合约的地址msg.value
:调用时发送的以太币数量block.timestamp
:当前区块的时间戳
address sender = msg.sender;
总结
- 值类型:
bool
、int/uint
、address
、bytes
、string
、enum
、function
- 引用类型:
array
、struct
、mapping
- 存储位置:
memory
、storage
、calldata
- 特殊类型:
contract
、interface
、library