2022-03-26|閱讀時間 ‧ 約 5 分鐘

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

此篇我們也來介紹另外一個也是蠻常用又蠻重要的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了,謝謝。
有什麼想要了解或是不清楚的部份,歡迎留言和我分享,謝謝。 如果喜歡我的文章歡迎追隨,按愛心,我每週都會上新文章。
分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.