上一篇文章我们简单的介绍了一个完整的Solidity文件的结构。接下来该学什么了?变量类型!没错!就是变量类型,相信大家C/C++、Java、Python总接触过一门吧。
当你在编写 Solidity 智能合约时,需要使用各种变量类型来存储和操作数据。了解这些数据类型的基本知识对于正确编写有效的智能合约至关重要。在本篇文章中,我们将介绍 Solidity 中可用的所有变量类型及其用法。
整型包括有符号整型(int)和无符号整型(uint)
有符号整型变量
布尔变量是一种只有两种可能值的变量类型,即 true 或 false。在 Solidity 中,布尔变量用于存储程序中的条件状态和判定逻辑。
Solidity 中的布尔变量类型是 bool。
Solidity 中的另一种常见变量类型是地址类型,用于存储以太坊地址。地址是以太坊区块链上的唯一标识符,它由 20 个字节组成,通常以十六进制表示。
Solidity 中可用的地址类型包括:
固定大小的数组bytesn,n的取值范围是1~32,byte等同于bytes1.
bytes1 aa = 0*35;
bytes2 bb = 10;
bytes3 cc = -1;
bytes4 dd = 259;
枚举类型(Enums)是Solidity的一种用户自定义类型,可以显式的与整数进行转换,但不能进行隐式转换
我们看下列示例:
pragma solidity ^0.8.0;
contract Seasons {
enum Season {SPRING, SUMMER, FALL, WINTER}
Season public currentSeason;
constructor() {
currentSeason = Season.SPRING;
}
function setSeason(Season _season) public {
currentSeason = _season;
}
}
函数类型是函数这种特殊的类型,可以将一个函数赋值给一个变量,还可以将一个函数作为参数进行传递,也可以在函数调用中返回一个函数。
函数分为两个类型:
不定长字节数组bytes是一个动态数组,能够容纳任意长度的字节
要在Solidity中声明动态字节数组,可以使用“字节”类型。此类型允许您创建任意长度的字节数组。下面是一个例子:
bytes memory myBytes = new bytes(10);
在这个例子中,我们创建了一个名为“myBytes”的字节数组,长度为10。您可以将“10”替换为任何整数值,以创建所需长度的字节数组。
如果要为字节数组赋值,可以使用以下语法:
myBytes = "hello world";
这将把字符串“helloworld”分配给字节数组。请注意,字节数组的长度将自动调整,以适应指定值的长度。
要在Solidity中使用字符串,您可以简单地用字符串类型声明一个变量。例如:
string myString = "Hello, world!";
也可以使用+连接字符串
如:
string greeting = "Hello, ";
string name = "Alice";
string message = greeting + name; // "Hello, Alice"
我们需要注意的是:Solidity中的字符串是UTF-8编码的,最大长度为2^256-1字节。
固定大小数组的长度在声明时确定,以后不能更改。它们是使用以下语法声明的:
uint[5] myArray;
这将创建一个由5个无符号整数组成的数组。您可以使用索引表示法访问和修改数组的各个元素,如下所示:
myArray[0] = 10;
uint x = myArray[1];
另一方面,动态数组的长度可以在运行时确定。它们是使用以下语法声明的:
uint[] myArray;
可以使用push方法将元素添加到数组中,如下所示:
myArray.push(10);
myArray.push(20);
也可以使用索引表示法访问和修改数组的各个元素,就像使用固定大小的数组一样。
struct被用来实现用户定义的数据类型,结构是一个组合数据类型,包含多个不同数据类型的变量,仅由变量过程
如:
struct User{
address addr;
unit amount;
}
在 Solidity 编程语言中,字典是一种非常有用的数据结构。字典是一种映射类型,可以将一个键(key)映射到一个值(value)。它类似于其他编程语言中的哈希表、关联数组或映射,可以用于存储和查找数据。
在 Solidity 中,我们可以使用以下两种方式来定义字典:
mapping (address => uint256) public balances;
这个 mapping 将一个地址映射到一个 uint256 类型的无符号整数,表示该地址的余额。我们可以使用以下代码来添加新的地址及其余额:
balances[0x1234567890123456789012345678901234567890] = 1000;
这条语句将地址 0x1234567890123456789012345678901234567890 的余额设置为 1000。
struct Person {
string name;
mapping (string => string) addresses;
}
这个 Person 结构体包含一个名为 name 的字符串类型成员和一个名为 addresses 的 mapping,将一个字符串类型的键映射到一个字符串类型的值,表示该人的地址信息。我们可以使用以下代码来添加新的地址及其信息:
Person p = Person("Alice");
p.addresses["home"] = "123 Main St.";
p.addresses["work"] = "456 Park Ave.";
这些语句将 Alice 的 home 地址设置为 “123 Main St.”,将 work 地址设置为 “456 Park Ave.”。
除了添加和查找操作外,字典还支持更新和删除操作。例如,我们可以使用以下代码将已有的地址余额更新为新的值:
balances[0x1234567890123456789012345678901234567890] = 2000;
删除字典中的元素也很简单。我们可以使用 delete 关键字来删除一个键的值,例如:
delete balances[0x1234567890123456789012345678901234567890];
这条语句将删除地址 0x1234567890123456789012345678901234567890 的余额信息。
总之,字典是 Solidity 中非常有用的一种数据结构,可以帮助我们存储和查找大量数据。无论是在编写智能合约还是在开发其他类型的 Solidity 应用程序,字典都是必不可少的工具之一。