六、数组及其操作《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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/285875.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Pix4d精品教程】垂直摄影空三加密生成DOM和DSM,并按10m间距提取高程点,生成等高线

在航测项目中,通常使用pix4d软件跑空三,生成数字正射影像DOM和数字表面模型DSM,当然还有点云数据。那么,在此基础之上,怎样根据航测要求,生成等间距5m或者10m的高程点和等高线呢,如上图所示?本文就来借助ArcGIS软件完成此波操作。 文章目录 一、Pix4d生成DOM和DSM二、A…

C语言试题七十三之请编写函数求两个数的最大公约数

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 编写函数:…

介绍一款python类型检查工具pyright

介绍 近日&#xff0c;微软在 Github 上开源了一个 Python 静态类型检查工具&#xff1a;pyright &#xff0c;引起了社区内的多方关注。 微软在开源项目上的参与力度是越来越大了&#xff0c;不说收购 Github 这种大的战略野心&#xff0c;只说它家开源的 VS Code 编辑器&am…

python使用localhost链接mysql出错及解决办法

在命令行下运行如下&#xff1a; import MySQLdb connMySQLdb.connect(hostlocalhost,userroot,passwdxxxx,dbtest1) xxxx是实际的密码。 但是运行上面代码时出现错误&#xff1a; Cant connect to local MySQL server... 但是&#xff0c;如果把localhost修改为127.0.0.1即可&…

使用 POST 向 ASP.NET Core 传递数据时的长度限制与解决方案

使用 HTTP 协议上传文件的标准做法是&#xff1a;使用 multipart/form-data 。但有时为了实现简单且要上传的文件不会太大&#xff0c;仍然会采用 application/x-www-form-urlencoded 上传文件&#xff0c;这就需要在上传前对二进制文件进行编码&#xff0c;比如使用 Base64 。…

Eclipse利用Maven2搭建SpringMVC框架的Web工程

一、准备工作&#xff1a; 下载apache-maven--> 配置Maven_home -->下载Eclipse Maven插件 二、新建工程&#xff1a; 选择新建Maven Project archetype选择webapp-->输入group ID &#xff08;src下包名&#xff09;和Artifact ID (工程名) 新建Maven工程目录如上图…

【ArcGIS风暴】ArcGIS10.6获取栅格影像边界范围的三种方法案例详解

基于ArcGIS平台有多种办法可以提取栅格影像边界,常见的方法有3种: 栅格范围(Raster Domain)栅格转面(Raster to Polygon)创建轮廓(BuildFootprints)/构建边界(BuildBoundary)文章目录 1. 栅格范围(Raster Domain)2. 栅格转面(Raster to Polygon)3. 创建轮廓(Bui…

七、结构体《2022 solidity8.+ 版本教程到实战》

结构体 结构体是一种可以自行定义的数据类型&#xff0c;其结构体内是复合的数据类型结构&#xff0c;当单一数据类型不能满足时可以使用创建所需结构体。 结构体定义使用 struct&#xff0c;例如以下示例&#xff1a; struct Human{uint age;string name;uint height;}以上…

微服务落地,我们在考虑什么?

原创&#xff1a; 李宁 博云技术社区 导读 微服务已经成为过去几年软件架构设计的“事实标准”&#xff0c;大多数企业在推动内部数字化转型的过程中&#xff0c;服务软件系统开始由单一或者SOA服务向微服务转型。那么转型过程需要遵循哪些原则呢&#xff1f;本文结合过往博云…

IDEA中使用数据库可视化操作工具

文章目录 1.入门介绍2. 没有数据库驱动3. 准备&测试连接3.1测试报错 4.连接5.编写SQL语句 1.入门介绍 在IDEA的专业版的右侧工具栏应该会有DataBase按钮如果没有的同学可以这样操作(必须是IDEA专业版) 新建数据库 2. 没有数据库驱动 如果提示: missing driver files ,…

WPF效果第一百九十篇之再耍ListBox

前面一篇效果基于Expander和ListBox实现了一下所需要的效果;今天再次实现点底部不一样的效果;最终实现的效果:1、ItemContainerStyle我是比较简单粗暴直接分了二行:ListBoxCanvas实现:<ControlTemplate TargetType"{x:Type ListBoxItem}"><Grid Background&…

C语言试题七十四之请编写函数求两个数的最小公倍数

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 编写函数:…

Rabbitmq~对Vhost的配置

rabbitmq里有一些概念我们要清楚&#xff0c;如vhost,channel,exchange,queue等&#xff0c;而前段时间在部署rabbitmq环境时启用了虚拟主机vhost&#xff0c;感觉他主要是起到了消息隔离的作用,下面分别再说一下它们的知识。 VHost vhost去做第一层的区分&#xff0c;虚拟主机…

【无人机驾照】无人机驾驶员考试题库选择题1060道(带答案)

001.无人机的英文缩写是 A. UVS B. UAS C. UAV 答案:C. 002.轻型无人机,是指空机质量 A. 小于7kg B. 大于7kg,小于116kg C. 大于116kg,小于5700kg 答案:B. 003近程无人机活动半径在 A. 小于15km B. 15~50km C. 200~800km 答案:B. 004任务高度一般在0~100m之间的无人…

表单元素 开篇

今天开始讲述表单这个重要模块 可以说,JS 最早是为表单而发明的, 因此在没有JS之前,所有操作都需要提交后端验证,发现有误再重定向回原页面, 加上之前1,2KB的网速,这用户体验真是奇差无比.因此JS最初发明出来&#xff0c;就是做表单验证的&#xff0e; 围绕表单&#xff0c;添加…

目录(文章更新中...)《实战NFT web3 solidity(新版本0.8.+)》

注&#xff1a;由于是付费专栏内容&#xff0c;若有错误请及时联系1_bit&#xff0c;博客链接&#xff1a;https://blog.csdn.net/A757291228 &#xff0c;或在文章下留言&#xff0c;收到后将会对错误进行改正&#xff0c;若是版本更新导致的问题也希望大家对错误进行提交&…

如何画出一张合格的技术架构图?

阿里妹导读&#xff1a;技术传播的价值&#xff0c;不仅仅体现在通过商业化产品和开源项目来缩短我们构建应用的路径&#xff0c;加速业务的上线速率&#xff0c;也体现在优秀工程师在工作效率提升、产品性能优化和用户体验改善等经验方面的分享&#xff0c;以提高我们的专业能…

.NET 发布和支持计划介绍

.NET 发布和支持计划介绍Intro对于 .NET 的发布&#xff0c;大多数童鞋都知道现在每年发布一个版本&#xff0c;针对 .NET 的发布&#xff0c;最近有些更新&#xff0c;Current 版本将改为 STS 版本&#xff0c;所以写一篇文章介绍一下每年 11 月都会发布新的 .NET 主要版本&am…

C语言试题七十五之请编写函数求回文数

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 编写函数:…

【spring boot】8.spring boot的日志框架logback使用

在继续上一篇的Debug调试之后&#xff0c;把spring boot的日志框架使用情况逐步蚕食。 参考&#xff1a;http://tengj.top/2017/04/05/springbo 开篇之前&#xff0c;贴上完整application.properties日志相关配置 简介&#xff1a;spring boot的默认日志框架Logback SLF4J——…