上一篇文章我们简单的介绍了一个完整的Solidity文件的结构。接下来该学什么了?变量类型!没错!就是变量类型,相信大家C/C++、Java、Python总接触过一门吧。solidity的变量类型跟之前学的可能不太一样,静静看。话不多说,直接开始!
文章目录
- 1.值类型
- 1.1 整型
- 1.2 布尔
- 1.3 地址
- 1.4 定长字节数组
- 1.5 有理数和整型字面量
- 1.6 枚举类型
- 1.7 函数
- 2 引用类型
- 2.1 不定长字节数组
- 2.2 字符串
- 2.3 数组
- 2.4 结构体
- 3.字典
1.值类型
1.1 整型
- 整型包括有符号整型(int)和无符号整型(uint),例如int8、int16、int24、···、int8n (1<=n<=32);uint8、uint16、uint24、···、uint8n (1<=n<=32)
unit和int的别名分别为unit256,int256 - 小数由"."组成,左边或者右边至少包含一个数字,如1.,.1 1.3均为有效的小数
1.2 布尔
布尔(bool)变量的值为true或false。
1.3 地址
address的长度为20字节,160位,所以可以用unit160编码
1.4 定长字节数组
固定大小的数组bytesn,n的取值范围是1~32,byte等同于bytes1.
bytes1 aa = 0*35;
bytes2 bb = 10;
bytes3 cc = -1;
bytes4 dd = 259;
1.5 有理数和整型字面量
- 整型字面量,如1,10,-1,-100.
- 字符字面量,如“test” 字符字面量可以用单引号,也可以用双引号
- 地址字面量
- 十六进制字面量
1.6 枚举类型
枚举类型(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;
}
}
1.7 函数
函数类型是函数这种特殊的类型,可以将一个函数赋值给一个变量,还可以将一个函数作为参数进行传递,也可以在函数调用中返回一个函数。
函数分为两个类型:
- 内部函数:内部函数只能在当前合约内被使用,不能在当前合约的上下文环境以外的地方执行,如在当前的代码块内包括内部库函数和继承的函数,默认的函数类型就是internal
- 外部函数:外部函数由地址和函数方法签名两部分组成,可作为外部函数调用的函数,或者由外部函数调用返回。
2 引用类型
2.1 不定长字节数组
不定长字节数组bytes是一个动态数组,能够容纳任意长度的字节
要在Solidity中声明动态字节数组,可以使用“字节”类型。此类型允许您创建任意长度的字节数组。下面是一个例子:
bytes memory myBytes = new bytes(10);
在这个例子中,我们创建了一个名为“myBytes”的字节数组,长度为10。您可以将“10”替换为任何整数值,以创建所需长度的字节数组。
如果要为字节数组赋值,可以使用以下语法:
myBytes = "hello world";
这将把字符串“helloworld”分配给字节数组。请注意,字节数组的长度将自动调整,以适应指定值的长度。
2.2 字符串
要在Solidity中使用字符串,您可以简单地用字符串类型声明一个变量。例如:
string myString = "Hello, world!";
也可以使用+连接字符串
如:
string greeting = "Hello, ";
string name = "Alice";
string message = greeting + name; // "Hello, Alice"
我们需要注意的是:Solidity中的字符串是UTF-8编码的,最大长度为2^256-1字节。
2.3 数组
固定大小数组的长度在声明时确定,以后不能更改。它们是使用以下语法声明的:
uint[5] myArray;
这将创建一个由5个无符号整数组成的数组。您可以使用索引表示法访问和修改数组的各个元素,如下所示:
myArray[0] = 10;
uint x = myArray[1];
另一方面,动态数组的长度可以在运行时确定。它们是使用以下语法声明的:
uint[] myArray;
可以使用push方法将元素添加到数组中,如下所示:
myArray.push(10);
myArray.push(20);
也可以使用索引表示法访问和修改数组的各个元素,就像使用固定大小的数组一样。
2.4 结构体
struct被用来实现用户定义的数据类型,结构是一个组合数据类型,包含多个不同数据类型的变量,仅由变量过程
如:
struct User{
address addr;
unit amount;
}
3.字典
在 Solidity 编程语言中,字典是一种非常有用的数据结构。字典是一种映射类型,可以将一个键(key)映射到一个值(value)。它类似于其他编程语言中的哈希表、关联数组或映射,可以用于存储和查找数据。
在 Solidity 中,我们可以使用以下两种方式来定义字典:
- 使用 mapping 类型, mapping 是 Solidity 中的一种内置类型,它可以将一个键映射到一个值。例如,我们可以创建一个名为 balances 的 mapping,用于存储地址余额信息:
mapping (address => uint256) public balances;
这个 mapping 将一个地址映射到一个 uint256 类型的无符号整数,表示该地址的余额。我们可以使用以下代码来添加新的地址及其余额:
balances[0x1234567890123456789012345678901234567890] = 1000;
这条语句将地址 0x1234567890123456789012345678901234567890 的余额设置为 1000。
- 使用关键字显式创建字典 除了使用 mapping 类型外,我们还可以使用关键字(如 struct、enum、contract 等)来显式地定义一个字典。例如,我们可以通过以下代码创建一个名为 Person 的结构体,并包含一个字典 addresses,用于存储一个人的地址信息:
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 应用程序,字典都是必不可少的工具之一。