Solidity之变量类型

上一篇文章我们简单的介绍了一个完整的Solidity文件的结构。接下来该学什么了?变量类型!没错!就是变量类型,相信大家C/C++、Java、Python总接触过一门吧。
当你在编写 Solidity 智能合约时,需要使用各种变量类型来存储和操作数据。了解这些数据类型的基本知识对于正确编写有效的智能合约至关重要。在本篇文章中,我们将介绍 Solidity 中可用的所有变量类型及其用法。

1.值类型

1.1 整型

整型包括有符号整型(int)和无符号整型(uint)
有符号整型变量

  • int8:8 位有符号整数
  • int16:16 位有符号整数
  • int32:32 位有符号整数
  • int64:64 位有符号整数
  • int128:128 位有符号整数
  • int256:256 位有符号整数
    无符号整型变量
  • uint8:8 位无符号整数
  • uint16:16 位无符号整数
  • uint32:32 位无符号整数
  • uint64:64 位无符号整数
  • uint128:128 位无符号整数
  • uint256:256 位无符号整数
    这些整型变量可以用来存储与计算有关的数字,如金额、数量等。
  • 小数由"."组成,左边或者右边至少包含一个数字,如1.,.1 1.3均为有效的小数

1.2 布尔

布尔变量是一种只有两种可能值的变量类型,即 true 或 false。在 Solidity 中,布尔变量用于存储程序中的条件状态和判定逻辑。

Solidity 中的布尔变量类型是 bool。

1.3 地址

Solidity 中的另一种常见变量类型是地址类型,用于存储以太坊地址。地址是以太坊区块链上的唯一标识符,它由 20 个字节组成,通常以十六进制表示。

Solidity 中可用的地址类型包括:

  • address:存储以太坊地址的变量类型。
  • address payable:与 address 相同,但具有额外的支付功能。

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 中,我们可以使用以下两种方式来定义字典:

  1. 使用 mapping 类型, mapping 是 Solidity 中的一种内置类型,它可以将一个键映射到一个值。例如,我们可以创建一个名为 balances 的 mapping,用于存储地址余额信息:
mapping (address => uint256) public balances;

这个 mapping 将一个地址映射到一个 uint256 类型的无符号整数,表示该地址的余额。我们可以使用以下代码来添加新的地址及其余额:

balances[0x1234567890123456789012345678901234567890] = 1000;

这条语句将地址 0x1234567890123456789012345678901234567890 的余额设置为 1000。

  1. 使用关键字显式创建字典 除了使用 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 应用程序,字典都是必不可少的工具之一。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员大凯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值