##mappingとは
mappingとは、配列のようにkeyとvalueを紐づけて保管し、後から参照できるようにする型です。
参考までにドキュメントの引用です。
マッピング型は mapping(_KeyType => _ValueType) という構文で宣言します。_KeyType はどの基本型でも入ります。つまりどのビルトインの型に加え、bytes と string が使えます。ユーザー定義、もしくはコントラクト型、enum、マッピング、構造体、bytes と string を除いた配列は使用できません。_ValueType はマッピングを含めて、どの型でもとることができます。
引用元:https://solidity-jp.readthedocs.io/ja/latest/types.html#mapping-types
##mappingの特徴および配列との違い
上記のドキュメントに書いてある点がほとんどですが、配列と違う点を挙げると以下の通り
①keyは入力した値のハッシュ値で保存される(厳密にはkeyは保存されてない?)
②valueからkeyを検索できない
③valueはnullを返すことはなく、無い場合は初期値を返す(これはsolidity自体の特徴?)
(例:uintは"0",addressは"0x0",stringは"",boolは"false"
④マッピングは長さを持たない
⑤storageにデータが保存される
keyを入力してvalueを参照する点に関しては配列と同様だが、そもそも長さを持ってなかったりと違う点も多いようですね
##コード
以下、ドキュメントのコードにコメントを追加しました
pragma solidity ^0.8.0;
contract MappingExample {
//addressがkey、uintがvalue、balansesは格納する変数
mapping(address => uint) public balances;
//set関数により、key=msg.senderとvalue=newBalanceを紐づけてbalancesに格納する
function set(uint newBalance) public {
balances[msg.sender] = newBalance;
}
//readValue関数により、keyにmsg.senderを入力しvalueを参照する
function readValue() public view returns (uint) {
return balances[msg.sender];
}
}
##おわり
以上です。間違い等あればコメントにてご指摘ください。
ありがとうございます。