此篇我們也來介紹另外一個也是蠻常用又蠻重要的Mapping,它和陣列有點像,但比較不同的是:它不能用迴圈的方式取出裡面所有的資料,但陣列可以,Mapping比較像是一個查詢系統,用key值可以取出裡面的value值。
常見的表達式:mapping( key => value)
直接看程式碼:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;
contract Mapping {
event LOG(address, uint);
mapping(address => uint) public myMap; //宣告一個mapping,名叫:myMap
address[] public myMappingAddr; //因為mapping沒辦法使用迴圈,所以用一個陣列來記錄
//設定mapping
function setMapping(address _myAddr, uint _number) public {
myMap[_myAddr] = _number;
myMappingAddr.push(_myAddr);
}
//取得mapping(傳入地址,回傳值)
function getMapping(address _myAddr) public view returns (uint) {
return myMap[_myAddr];
}
//刪除mapping(和陣列一樣,只刪除內容(歸零),不會刪除key)
function deleteMapping(address _myAddr) public {
delete myMap[_myAddr];
}
//總計
function getTotal() public view returns (uint) {
require(myMappingAddr.length > 0, "The mapping has no values!"); //驗證mapping的長度是否為零
//利用陣列取出mapping內所有的值做加總
uint sum = 0;
for (uint i = 0; i < myMappingAddr.length; i++){
address key = myMappingAddr[i];
uint value = myMap[key];
sum += value;
}
return sum; //回傳
}
//寫一個test,測試自己的function是否正確
function test() public {
//模擬設定了兩個地址和參數
setMapping(0x5B38Da6a701c568545dCfcB03FcB875f56beddC4, 10);
setMapping(0x785aBdDd01bBeCA2D0a68b3461F0779eDc3A7A15, 20);
uint sum = getTotal();//取得總計
assert(sum == 30); //最後的驗證
}
}
其實從程式碼就很容易看出,mapping和array其實還蠻相似的,兩個都像容器一樣可以用來存放,但只差在array可以跑迴圈但mapping不行,而mapping可以用key值做查詢取出value值而array沒有,所以mapping和array都還蠻常用的,但使用上有點不同,各位還是要先了解這兩個的使用方式,之後在寫程式時就知道在什麼場合應該用mapping或是array了,謝謝。
有什麼想要了解或是不清楚的部份,歡迎留言和我分享,謝謝。
如果喜歡我的文章歡迎追隨,按愛心,我每週都會上新文章。