Solidity 数据类型详解:值类型与引用类型

  • Louis
  • 更新于 2天前
  • 阅读 253

基本概念Solidity是一种用于编写以太坊智能合约的高级编程语言。在Solidity中,数据类型分为值类型(基本数据类型)和引用类型。

基本概念

Solidity 是一种用于编写以太坊智能合约的高级编程语言。在 Solidity 中,数据类型分为值类型(基本数据类型)和引用类型。理解这些数据类型及其使用场景是编写高效、安全智能合约的基础。本文将详细介绍 Solidity 中的值类型和引用类型,并通过示例说明它们的使用场景。

1. 值类型(基本数据类型)

值类型在赋值或传递时总是按值拷贝,而不是按引用。修改拷贝的值不会影响原始值。

(1) 布尔类型

  • 类型bool
  • 取值truefalse
  • 示例
bool isReady = true;
bool isFinished = false;
  • 使用场景:用于表示状态或条件,例如合约中的开关或权限控制。

(2) 整数类型

  • 有符号整数

<!---->

    • 类型:int8int256,以 8 位为步长(如 int8, int16, ..., int256)。
    • intint256 的别名。
    • 示例
int256 a = -10;
int b = 20; // int 是 int256 的别名
    • 使用场景:用于表示有符号的数值,例如温度、账户余额变化等。

<!---->

  • 无符号整数

<!---->

    • 类型:uint8uint256,以 8 位为步长(如 uint8, uint16, ..., uint256)。
    • uintuint256 的别名。
    • 示例
uint256 c = 100;
uint d = 200; // uint 是 uint256 的别名
    • 使用场景:用于表示无符号的数值,例如账户余额、计数器等。

(3) 地址类型

  • 类型

<!---->

    • address:存储 20 字节的以太坊地址。
    • address payable:与 address 类似,但可以接收以太币(ether)。

<!---->

  • 示例
address user = 0x1234567890123456789012345678901234567890;
address payable recipient = payable(user);
  • 使用场景:用于存储以太坊地址,例如用户地址、合约地址等。

(4) 固定大小字节数组

  • 类型bytes1bytes32
  • 示例
bytes32 hash = keccak256("Hello, Solidity!");
bytes1 firstByte = 0x01;
  • 使用场景:用于存储固定长度的字节数据,例如哈希值、加密数据等。

(5) 枚举类型

  • 类型enum
  • 示例
enum State { Created, Locked, Inactive }
State public state = State.Created;
  • 使用场景:用于表示一组常量,例如订单状态、用户角色等。

2. 引用类型

引用类型在赋值或传递时按引用传递,修改引用会影响原始数据。

(1) 数组

  • 固定大小数组

<!---->

    • 类型:T[k],其中 T 是元素类型,k 是固定长度。
    • 示例
uint[5] fixedArray;
    • 使用场景:用于存储固定长度的数据集合,例如投票结果、固定大小的列表等。

<!---->

  • 动态大小数组

<!---->

    • 类型:T[],其中 T 是元素类型。
    • 示例
uint[] dynamicArray;
    • 使用场景:用于存储可变长度的数据集合,例如用户列表、动态数据集等。

(2) 字节数组

  • 类型

<!---->

    • bytes:动态大小的字节数组。
    • string:动态大小的 UTF-8 字符串(本质上是 bytes 的特殊形式)。

<!---->

  • 示例
bytes data = "Hello";
string name = "Solidity";
  • 使用场景:用于存储字节数据或字符串,例如文件内容、文本信息等。

(3) 结构体

  • 类型struct
  • 示例
struct User {
    string name;
    uint age;
}
User alice = User("Alice", 25);
  • 使用场景:用于定义复杂的数据结构,例如用户信息、订单详情等。

(4) 映射

  • 类型mapping
  • 示例
mapping(address => uint) balances;
balances[0x123...] = 100;
  • 使用场景:用于存储键值对数据,例如账户余额、用户权限等。

3. 特殊类型

(1) 合约类型

  • 类型contract
  • 示例
contract MyContract {
    function foo() public pure returns (string memory) {
        return "Hello";
    }
}
MyContract c = new MyContract();
  • 使用场景:用于创建和调用其他合约。

总结

  • 值类型boolintuintaddressbytes1bytes32enumfunction
  • 引用类型:数组、bytesstringstructmapping
  • 特殊类型contract
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。
该文章收录于 Solidity从入门到进阶
7 订阅 26 篇文章

0 条评论

请先 登录 后评论
Louis
Louis
web3 developer,技术交流或者有工作机会可加VX: magicalLouis