前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >六、数组及其操作《2022 solidity8.+ 版本教程到实战》

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

作者头像
1_bit
发布2022-10-04 18:54:31
2600
发布2022-10-04 18:54:31
举报
文章被收录于专栏:我的知识小屋我的知识小屋

一、数组

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

1.创建数组

定长数组

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

代码语言:javascript
复制
uint[3] public number2=[1,2,3];

动态数组

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

代码语言:javascript
复制
uint[] public number=[1,2,3];

2.数组操作

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

增数据

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

代码语言:javascript
复制
number.push(val);

删数据

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

代码语言:javascript
复制
delete number[1];

还有一个方法是 pop:

代码语言:javascript
复制
number.pop();

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

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

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

代码语言:javascript
复制
function createArray()external pure{
    uint[] memory ages = new uint[](3);
}

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

二、数组删除某值的方式

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

代码语言:javascript
复制
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.6;
contract ArrayDemo{
}

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

代码语言:javascript
复制
uint[] public number=[1,2,3];
uint[3] public number2=[1,2,3];

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

代码语言:javascript
复制
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了?所以代码如下:

代码语言:javascript
复制
function removeVal(uint index)external{
    require(index<number.length,'index out of array');
    number[index]=number[number.length-1];
    number.pop();
}

完整代码如下:

代码语言:javascript
复制
// 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 中创建一个 映射示例如下:

代码语言:javascript
复制
mapping(address=>uint) public balances;

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

代码语言:javascript
复制
mapping(address=>mapping(address=>uint)) public balances1;

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

代码语言:javascript
复制
function  setMapVal(address key,uint val)external{
    balances[key]=val;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-09-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、数组
    • 1.创建数组
      • 定长数组
      • 动态数组
    • 2.数组操作
      • 增数据
      • 删数据
    • 3.数组在函数中进行创建
    • 二、数组删除某值的方式
    • 三、映射 map
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档