【開發智能合約 — Solidity系列】實作篇Ep.15 — 映射的奧秘(Mapping)
Mapping(映射)就像是字典表一樣,鍵入「什麼樣的標題」對應到「什麼樣的內容」,而標題就是從內容提煉出來的一種簡短快速識別的標的,透過這種方式,我們未來找尋內文時,只要先透過標題來查找,絕對會比直接找內文快上好幾倍,因此Mapping常常應用在查找事物上,它有點像一般程式語言的HashTable,主要目的在於透過對應表快速定位到詳細的資訊。
語法結構
/// 錢包餘額對應表
/// 錢包地址 <-剩餘-> 金額
mapping(address => uint) public _balances;
如何設定對應表?
function updateBalance(uint newBalance) public {
_balances[msg.sender] = newBalance;
}
取得特定值
取得的方式非常簡單,我們宣告一個正確型別的變數進行承接之後,就能夠使用到儲存的值,進行加工後,再次設定。
uint _balance = _balances[msg.sender];
刪除某一組
藉由delete關鍵字重新設定某一組key值。
delete _balances[msg.sender];
相關的限制
- 鍵值(Key)僅能是Solidity的基本型態(strings、uint…),複雜型態(array、struct…)是不被允許的。
- 預設不支援iterable,因此無法自然的逐一處理,但提供自行實作的擴充能力,請參考這裡。
結語
Mapping是一種非常好用的資料結構,我們日常生活中諸如電話黃頁、書籤、五金行分類…等,舉凡與搜尋有關的整理,皆是在將龐雜的資訊濃縮成摘要,並且進行恰當的分類之後,讓我們更容易找尋這堆龐雜的資料,在區塊鏈的世界上亦是如此,錢包地址的背後可能夾藏的非常複雜的資訊,透過Mapping快速定位到關鍵位置,進行進一步的處理。
今天的範例都在這裡「📦 solidity-remix-toturial/Ep15」歡迎自行取用。
----------------------------------------------------------------------------------
喜歡撰寫文章的你,不妨來了解一下:
Web3.0時代下為創作者、閱讀者打造的專屬共贏平台 — 為什麼要加入?
歡迎加入一起練習寫作,賺取知識,累積財富!
資源參考
- https://rickbsr.medium.com/淺談-hash-hashtable-與-hashmap-4e5f5e5d36da
- https://codeforgeek.com/mappings-inside-structs-in-solidity/