# Learn Solidity Series 5: struct mappings enum

By [Renaissance Labs](https://paragraph.com/@renaissance-labs) · 2022-02-25

---

![Learn Solidity Series](https://storage.googleapis.com/papyrus_images/c89c66949231ed1978aa157c38f8ebeb44a45b07fa00ac0e49aeb092bf9470b6.png)

Learn Solidity Series

Struct
------

> 与在C和C ++中一样，结构体允许你定义自己的类型

定义结构体后，就可以开始将其用作状态变量或在函数中使用。

    struct Donation {
          uint256 value;
          uint256 date;
    }
    

为了初始化一个结构体，我们有两种方法：

*   使用位置参数：
    
        Donation donation = Donation(
        msg.value,
        block.timestamp
        );
        
    
*   使用关键字：
    

    Donation donation = Donation({
    value : msg.value,
    date: block.timestamp
    });
    

第二种方法将避免我们必须记住结构体成员的顺序，因此它可能比第一种有用。

使用点访问结构体的成员：

    uint256 donationDate = myDonation.date;
    

> 虽然结构体本身可以是映射成员的值类型，也可以在动态大小的数组里使用，但是结构体不能包含其自身类型的成员。这个限制是必要的，因为结构体的大小必须是有限的。 — Solidity文档

Mappings
--------

你可以将映射视为大量的键/值存储，其中每个可能的键都存在，并且可以使用该键来设置或检索任何值。

映射声明如下：

    mapping( KeyType => ValueType) VariableName
    

KeyType可以是任何内置值类型、字节或字符串中看到的值、也可以是任何合约或枚举类型。ValueType可以是任何类型，包括映射，数组和结构体。

这里要提到的一件事是，映射变量唯一允许的数据位置是storage，它只能声明为状态变量、存储指针或库函数的参数。

Enum
----

枚举允许你将自定义类型下的相关值分组，如以下示例所示：

    enum Color { green , blue, red }
    

使用以下语法可以访问enum值：

    Color defaultColor = Color.green;
    

注意：枚举也可以在文件级别上声明，而不是在合约或库定义中。

Constant and Immutable Variable
-------------------------------

状态变量可以声明为constant或immutable。在这两种情况下，构造合约后都无法修改变量。对于constant，该值必须在编译时确定，而对于immutable，则是在构造时赋值。

编译器不会为这些变量保留一个存储槽，而是在每次出现时会由相应的值替换。

常量使用关键字constant声明：

    uint256 constant maxParticipants = 10;
    

对于不可变状态变量，使用关键字immutable声明它们：

    contract Cook {
    address immutable owner = msg.sender;
    uint256 immutable maxBalance;  
    constructor(uint256 _maxBalance){
           maxBalance = _maxbalance;
      }
    }
    

你可以在文档的本部分中找到有关常量和不可变状态变量的更多详细信息。

注意：也可以在文件级别定义constant变量。

---

*Originally published on [Renaissance Labs](https://paragraph.com/@renaissance-labs/learn-solidity-series-5-struct-mappings-enum)*
