91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Solidity結構體與映射是什么

發布時間:2021-12-07 15:42:54 來源:億速云 閱讀:212 作者:iii 欄目:互聯網科技

這篇文章主要介紹“Solidity結構體與映射是什么”,在日常操作中,相信很多人在Solidity結構體與映射是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Solidity結構體與映射是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

結構體(Structs)

Solidity提供struct來定義自定義類型,自定義的類型是引用類型。 我們看看下面的例子:

pragma solidity ^0.4.11;

contract CrowdFunding {
    // 定義一個包含兩個成員的新類型
    struct Funder {
        address addr;
        uint amount;
    }

    struct Campaign {
        address beneficiary;
        uint fundingGoal;
        uint numFunders;
        uint amount;
        mapping (uint => Funder) funders;
    }

    uint numCampaigns;
    mapping (uint => Campaign) campaigns;

    function newCampaign(address beneficiary, uint goal) public returns (uint campaignID) {
        campaignID = numCampaigns++; // campaignID 作為一個變量返回
        // 創建一個結構體實例,存儲在storage ,放入mapping里
        campaigns[campaignID] = Campaign(beneficiary, goal, 0, 0);
    }

    function contribute(uint campaignID) public payable {
        Campaign storage c = campaigns[campaignID];
        // 用mapping對應項創建一個結構體引用
        // 也可以用 Funder(msg.sender, msg.value) 來初始化.
        c.funders[c.numFunders++] = Funder({addr: msg.sender, amount: msg.value});
        c.amount += msg.value;
    }

    function checkGoalReached(uint campaignID) public returns (bool reached) {
        Campaign storage c = campaigns[campaignID];
        if (c.amount < c.fundingGoal)
            return false;
        uint amount = c.amount;
        c.amount = 0;
        c.beneficiary.transfer(amount);
        return true;
    }
}

上面是一個簡化版的眾籌合約,但它可以讓我們理解structs的基礎概念,struct可以用于映射和數組中作為元素。其本身也可以包含映射和數組等類型。

不能聲明一個struct同時將自身struct作為成員,這個限制是基于結構體的大小必須是有限的。 但struct可以作為mapping的值類型成員。

注意在函數中,將一個struct賦值給一個局部變量(默認是storage類型),實際是拷貝的引用,所以修改局部變量值的同時,會影響到原變量。

當然,也可以直接通過訪問成員修改值,而不用一定賦值給一個局部變量,如campaigns[campaignID].amount = 0

映射(Mappings)

映射類型,一種鍵值對的映射關系存儲結構。定義方式為mapping(_KeyType => _KeyValue)。鍵類型允許除映射、變長數組、合約、枚舉、結構體外的幾乎所有類型()。值類型沒有任何限制,可以為任何類型包括映射類型。

映射可以被視作為一個哈希表,所有可能的鍵會被虛擬化的創建,映射到一個類型的默認值(二進制的全零表示)。在映射表中,并不存儲鍵的數據,僅僅存儲它的keccak256哈希值,這個哈希值在查找值時需要用到。 正因為此,映射是沒有長度的,也沒有鍵集合或值集合的概念。

映射類型,僅能用來作為狀態變量,或在內部函數中作為storage類型的引用。

可以通過將映射標記為public,來讓Solidity創建一個訪問器。通過提供一個鍵值做為參數來訪問它,將返回對應的值。 映射的值類型也可以是映射,使用訪問器訪問時,要提供這個映射值所對應的鍵,不斷重復這個過程。 來看一個例子:

pragma solidity ^0.4.0;

contract MappingExample {
    mapping(address => uint) public balances;

    function update(uint newBalance) public {
        balances[msg.sender] = newBalance;
    }
}

contract MappingUser {
    function f() public returns (uint) {
        MappingExample m = new MappingExample();
        m.update(100);
        return m.balances(this);
    }
}

注意: 映射并未提供迭代輸出的方法,可以自行實現一個這樣的數據結構。

到此,關于“Solidity結構體與映射是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

荥经县| 延津县| 化德县| 永吉县| 河东区| 澄江县| 平湖市| 深泽县| 肇庆市| 体育| 鹤壁市| 香河县| 六盘水市| 阿尔山市| 德安县| 华容县| 沧源| 定边县| 乌恰县| 洪洞县| 潞城市| 报价| 万盛区| 江北区| 蕉岭县| 张家界市| 资源县| 五大连池市| 都江堰市| 湘潭县| 泽州县| 崇州市| 玉田县| 封开县| 台东市| 安丘市| 阳高县| 奉化市| 怀化市| 舟曲县| 读书|