IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 区块链 -> 六、数组及其操作《2022 solidity8.+ 版本教程到实战》 -> 正文阅读

[区块链]六、数组及其操作《2022 solidity8.+ 版本教程到实战》

一、数组

在 solidity 中,数组分为定长数组和动态数据,这两者的定义上跟 golang 很相似;其定长数组在创建好后不能设置超过数组长度的值,也就是不能push;而动态数组允许 push,还有一点很有意思的是,在删除数组某个元素后,删除的数组中的某个位置的值是还原成了当前类型数组的类型默认值。

1.创建数组

定长数组

定长数组创建很简单,只需要在表示数组的 [] 符号中编写对应的长度即可:

uint[3] public number2=[1,2,3];

动态数组

动态数组和定长数组的定义区别则是不需要在 [] 中编写固定长度,跟 go 很像:

uint[] public number=[1,2,3];

2.数组操作

在 solidity 中就可以对数组进行增删改,改数据不必多说,直接索引后进行值的更改就好,接下来咱们来看在数组中的增删。

增数据

既然定长数组不能够增加长度,那么就说明我们加数组内容需要使用的对象是动态数组,动态数组使用增加数据的方式很简单,直接使用 push 某值即可,代码是:

number.push(val);

删数据

在数组中删除某个值可以使用 delete方法,例如:

delete number[1];

还有一个方法是 pop:

number.pop();

由于使用 delete 方式删除值只是使数组中的某个位置的值归为这个类型的原始值,并不能修改其长度,所以 delete 方法一般用于删除定长数组的值;而 pop 方法将会删除这个数组中最后一个元素值,并且使其长度发生改变,所以可用于动态数组之中。

3.数组在函数中进行创建

创建数组时,若在与方法同级,那么则直接创建数组即可,若在函数之中,需要指定当前数据的位置,例如以下一个方法:

function createArray()external pure{
    uint[] memory ages = new uint[](3);
}

以上方法创建了一个 uint 类型的定长数组,使用 memory 指定为内存级别的变量,长度为3。

二、数组删除某值的方式

在此我们创建一个合约名为 ArrayDemo:

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.6;
contract ArrayDemo{
}

在合约中创建两个数组,一个定长一个动态:

uint[] public number=[1,2,3];
uint[3] public number2=[1,2,3];

接着创建几个操作数组的方法:

function push(uint val)external{
    number.push(val);
}
function pop()external{
    number.pop();
}

function deleteVal()external{
    delete number[number.length-1];
}

function createArray()external pure{
    uint[] memory ages = new uint[](3);
}

function getArray()external view returns(uint[] memory){
    return number;
}

以上最后一个代码为返回对应的数组内容,此时需要指定返回类型为 uint[] 的 memory。

接着我们需要完成如何删除一个动态数组中的指定索引元素,并且使其长度发生改变。

通过需求可知,我们必然会使用到 pop 方法,那么如何使用 pop 方法呢?首先我们要删除指定索引,那么指定索引的位置的值必将删除,则说明该索引位置的值无效,那么接下来我们还需要使数组的长度-1.那么此时我们可以想到,数组长度减1后那么数组最后一个值将会丢失,此时只需要将最后一个位置的值放到删除索引位置的值上,再执行 pop 是不是就ok了?所以代码如下:

function removeVal(uint index)external{
    require(index<number.length,'index out of array');
    number[index]=number[number.length-1];
    number.pop();
}

完整代码如下:

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.6;
contract ArrayDemo{
    uint[] public number=[1,2,3];
    uint[3] public number2=[1,2,3];

    function push(uint val)external{
        number.push(val);
    }
    function pop()external{
        number.pop();
    }
    
    function deleteVal()external{
        delete number[number.length-1];
    }

    function createArray()external pure{
        uint[] memory ages = new uint[](3);
    }

    function getArray()external view returns(uint[] memory){
        return number;
    }

    function removeVal(uint index)external{
        require(index<number.length,'index out of array');
        number[index]=number[number.length-1];
        number.pop();
    }
}

三、映射 map

映射其实就是map 或者是 字典,在 solidity 中创建一个 映射示例如下:

mapping(address=>uint) public balances;

映射的创建使用 mapping,在后的圆括号中编写映射的类型,如上示例为 key 为 address value 为 uint,这个映射变量名为 balances,映射中可以存在映射,例如:

mapping(address=>mapping(address=>uint)) public balances1;

设置一个 map 值的方式也很简单,如下 function :

function  setMapVal(address key,uint val)external{
    balances[key]=val;
}
  区块链 最新文章
盘点具备盈利潜力的几大加密板块,以及潜在
阅读笔记|让区块空间成为商品,打造Web3云
区块链1.0-比特币的数据结构
Team Finance被黑分析|黑客自建Token“瞒天
区块链≠绿色?波卡或成 Web3“生态环保”标
期货从入门到高深之手动交易系列D1课
以太坊基础---区块验证
进入以太坊合并的五个数字
经典同态加密算法Paillier解读 - 原理、实现
IPFS/Filecoin学习知识科普(四)
上一篇文章           查看所有文章
加:2022-09-24 21:02:08  更:2022-09-24 21:03:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:50:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码