智能合約開發實戰(11) - Mapping

2022/03/26閱讀時間約 1 分鐘
此篇我們也來介紹另外一個也是蠻常用又蠻重要的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了,謝謝。
有什麼想要了解或是不清楚的部份,歡迎留言和我分享,謝謝。
如果喜歡我的文章歡迎追隨,按愛心,我每週都會上新文章。
為什麼會看到廣告
宅D嘉
宅D嘉
有著十年以上的軟體開發經驗,喜歡投資理財,目前喜歡研究區塊鏈相關,了解虛擬貨幣投資或者是區塊鏈開發,喜歡把複雜的東西簡單化,樂於分享我的理財投資生活。
留言0
查看全部
發表第一個留言支持創作者!