Solidity結(jié)構(gòu)體與映射是什么

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

成都創(chuàng)新互聯(lián)為企業(yè)級客戶提高一站式互聯(lián)網(wǎng)+設(shè)計(jì)服務(wù),主要包括網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、重慶APP開發(fā)公司、微信平臺小程序開發(fā)、宣傳片制作、LOGO設(shè)計(jì)等,幫助客戶快速提升營銷能力和企業(yè)形象,創(chuàng)新互聯(lián)各部門都有經(jīng)驗(yàn)豐富的經(jīng)驗(yàn),可以確保每一個(gè)作品的質(zhì)量和創(chuàng)作周期,同時(shí)每年都有很多新員工加入,為我們帶來大量新的創(chuàng)意。 

結(jié)構(gòu)體(Structs)

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

pragma solidity ^0.4.11;

contract CrowdFunding {
    // 定義一個(gè)包含兩個(gè)成員的新類型
    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 作為一個(gè)變量返回
        // 創(chuàng)建一個(gè)結(jié)構(gòu)體實(shí)例,存儲在storage ,放入mapping里
        campaigns[campaignID] = Campaign(beneficiary, goal, 0, 0);
    }

    function contribute(uint campaignID) public payable {
        Campaign storage c = campaigns[campaignID];
        // 用mapping對應(yīng)項(xiàng)創(chuàng)建一個(gè)結(jié)構(gòu)體引用
        // 也可以用 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;
    }
}

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

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

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

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

映射(Mappings)

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

映射可以被視作為一個(gè)哈希表,所有可能的鍵會被虛擬化的創(chuàng)建,映射到一個(gè)類型的默認(rèn)值(二進(jìn)制的全零表示)。在映射表中,并不存儲鍵的數(shù)據(jù),僅僅存儲它的keccak256哈希值,這個(gè)哈希值在查找值時(shí)需要用到。 正因?yàn)榇耍?strong>映射是沒有長度的,也沒有鍵集合或值集合的概念。

映射類型,僅能用來作為狀態(tài)變量,或在內(nèi)部函數(shù)中作為storage類型的引用。

可以通過將映射標(biāo)記為public,來讓Solidity創(chuàng)建一個(gè)訪問器。通過提供一個(gè)鍵值做為參數(shù)來訪問它,將返回對應(yīng)的值。 映射的值類型也可以是映射,使用訪問器訪問時(shí),要提供這個(gè)映射值所對應(yīng)的鍵,不斷重復(fù)這個(gè)過程。 來看一個(gè)例子:

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);
    }
}

注意: 映射并未提供迭代輸出的方法,可以自行實(shí)現(xiàn)一個(gè)這樣的數(shù)據(jù)結(jié)構(gòu)。

到此,關(guān)于“Solidity結(jié)構(gòu)體與映射是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

網(wǎng)站題目:Solidity結(jié)構(gòu)體與映射是什么
標(biāo)題鏈接:http://muchs.cn/article0/pphsio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、外貿(mào)建站、搜索引擎優(yōu)化、服務(wù)器托管、Google、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化