本文我們介紹Solidity語言的資料類型,重點是值類型,包括布爾類型、整型、位址類型、位元組類型、字元串類型和枚舉類型。并且通過兩個合約例子來示範這些資料類型的使用方法。
基本概念
Solidity中關于資料類型的定義如下:
- Solidity是一種靜态類型語言,這意味着每個變量都需要在編譯時指定變量的類型;
- Solidity中新聲明的變量總是有一個預設值,具體的預設值跟類型有關,例如bool類型的預設值為false。
資料類型
值類型
Solidity提供的基本資料類型。這些類型的變量總是通過值傳遞的,變量在函數參數或指派語句中使用時都會被複制。有以下幾類值類型的資料類型:
1.布爾類型
bool:可接受 true 和 false 兩個值,預設為 false。
2.整型
int 和 uint:分别表示有符号和無符号的整數,預設為0。支援關鍵字 int8 到 int256,以及 uint8 到 uint256,從8位到256位,以8位為步長遞增,int 和 uint 分别是 int256 和 uint256 的别名。
3.位址類型
address:包含一個20位元組的值(代表一個以太坊位址的大小)。一個位址可以用來擷取餘額,也可以通過轉賬的方式來轉移餘額。
4.位元組類型
bytes1,bytes2,...,bytes32:位元組用于存儲固定大小的字元集,長度範圍是1 ~ 32。位元組的一個優點是它使用更少的Gas,是以當我們知道資料的長度時,最好使用它。
5.字元串類型
string:字元串用于存儲等于或大于一個位元組的字元集,字元串的長度是動态的。
6.枚舉類型
enum:建立使用者定義的資料類型,用于為一個整型常量配置設定一個名稱,這使得合約具有可讀性、可維護性和更不容易出錯。枚舉的選項可以用從0開始的無符号整數值表示。
文法如下:
enum <enum_name> { element 1, element 2, ..., element n }
引用類型
引用類型變量存儲資料的位置。在引用類型的定義中,兩個不同的變量可以引用同一個位置,其中一個變量的任何更改都會影響另一個變量。引用類型包括數組、結構和映射。關于引用類型,我們将在後面的文章中單獨介紹。
合約例子
例子1
基本資料類型的聲明與用法。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
// 值類型
contract DataTypes {
// 布爾類型
bool public boo = true;
// 整型
uint8 public u8 = 123;
uint256 public u256 = 456;
uint public u = 789;
int8 public i8 = -1;
int256 public i256 = -456;
int public i = -789;
// 整型的最小值與最大值
int public minInt = type(int).min;
int public maxInt = type(int).max;
// 位址類型
address public addr = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
uint public balance = addr.balance;
// 位元組類型
bytes1 public b1 = 0x1a;
bytes2 public b2 = 0x1a2b;
bytes32 public b32 = 0x35c777b82e0fb4652a3562e28e1cf714ba503232888a7334e08377cb12cdd29c;
// 字元串類型
string public str = "this is a string data type";
// 預設值
bool public defaultBoo; // false
uint public defaultUint; // 0
int public defaultInt; // 0
address public defaultAddr; // 0x0000000000000000000000000000000000000000
}
輸出:我們在Remix中編譯、部署和運作上面的合約例子,執行結果如下圖:
Solidity 資料類型
例子2
枚舉類型的聲明及用法。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
// 枚舉類型
contract Enum {
// 定義一個枚舉類型
enum Action { Up, Down, Left, Right }
// 定義變量,預設值為第一個元素,即"Up"的值
Action public action;
// 設定預設值
function setDefault() public {
action = Action.Left;
}
// 設定,傳遞一個uint值(0-3)
function set(Action _action) public {
action = _action;
}
// 取值,傳回一個uint值
function get() public view returns(Action) {
return action;
}
// 取最小值
function getMinValue() public pure returns(Action) {
return type(Action).min;
}
// 取最大值
function getMaxValue() public pure returns(Action) {
return type(Action).max;
}
}
輸出:我們在Remix中編譯、部署和運作上面的合約例子,執行結果如下圖:
Solidity 枚舉類型