# Solidity极简入门: 7. 映射类型 mapping

By [0xAA](https://paragraph.com/@wtfacademy) · 2022-04-10

---

我最近在重新学solidity，巩固一下细节，也写一个“Solidity极简入门”，供小白们使用（编程大佬可以另找教程），每周更新1-3讲。

欢迎关注我的推特：[@0xAA\_Science](https://twitter.com/0xAA_Science)

WTF技术社群discord，内有加微信群方法：[链接](https://discord.gg/5akcruXrsk)

所有代码和教程开源在github（1024个star发课程认证，2048个star发社群NFT）: [github.com/AmazingAng/WTFSolidity](https://github.com/AmazingAng/WTFSolidity)

* * *

这一讲，我们将介绍solidity中的哈希表：映射（Mapping）类型。

映射Mapping
---------

在映射中，人们可以通过键（Key）来查询对应的值（Value），比如：通过一个人的id来查询他的钱包地址。

声明映射的格式为 `mapping(_KeyType => _ValueType)`，其中`_KeyType`和`_ValueType`分别是Key和Value的变量类型。例子：

        mapping(uint => address) public idToAddress; // id映射到地址
        mapping(address => address) public swapPair; // 币对的映射，地址到地址
    

映射的规则
-----

**规则1**：映射的`_KeyType`只能选择`solidity`默认的类型，比如`uint`，`address`等，不能用自定义的结构体。而`_ValueType`可以使用自定义的类型。下面这个例子会报错，因为`_KeyType`使用了我们自定义的结构体：

        // 我们定义一个结构体 Struct
        struct Student{
            uint256 id;
            uint256 score; 
        }
         mapping(Student => uint) public testVar;
    

**规则2**：映射的存储位置必须是`storage`，因此可以用于合约的状态变量，函数中的`storage`变量。不能用于`public`函数的参数或返回结果中。

**规则3**：如果映射声明为`public`，那么`solidity`会自动给你创建一个`getter`函数，可以通过Key来查询对应的Value。

**规则4**：给映射新增的键值对的语法为`_Var[_Key] = _Value` ，其中`_Var`是映射变量名，`_Key`和`_Value`对应新增的键值对。例子：

        function writeMap (uint _Key, address _Value) public{
            idToAddress[_Key] = _Value;
        }
    

总结
--

这一讲，我们介绍了solidity中哈希表——映射（Mapping）的用法。至此，我们已经学习了所有常用变量种类，之后我们会学习控制流if-else, while等。

---

*Originally published on [0xAA](https://paragraph.com/@wtfacademy/solidity-7-mapping)*
