【从0学习Solidity】 6. 引用类型, array, struct

news2024/11/20 3:30:31

【从0学习Solidity】 6. 引用类型, array, struct

在这里插入图片描述

  • 博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。
  • 关注我们的主页,探索全栈开发,期待与您一起在移动开发的世界中,不断进步和创造!
  • 本文收录于 不写代码没饭吃 的学习汇报系列,大家有兴趣的可以看一看。
  • 欢迎访问我们的微信公众号:不写代码没饭吃,获取更多精彩内容、实用技巧、行业资讯等。您关注的是我们前进的动力!

这一讲,我们将介绍solidity中的两个重要变量类型:数组(array)和结构体(struct)。

数组 array

数组(Array)是solidity常用的一种变量类型,用来存储一组数据(整数,字节,地址等等)。数组分为固定长度数组和可变长度数组两种:

  • 固定长度数组:在声明时指定数组的长度。用T[k]的格式声明,其中T是元素的类型,k是长度,例如:
    // 固定长度 Array
    uint[8] array1;
    bytes1[5] array2;
    address[100] array3;
  • 可变长度数组(动态数组):在声明时不指定数组的长度。用T[]的格式声明,其中T是元素的类型,例如:
    // 可变长度 Array
    uint[] array4;
    bytes1[] array5;
    address[] array6;
    bytes array7;

注意bytes比较特殊,是数组,但是不用加[]。另外,不能用byte[]声明单字节数组,可以使用bytesbytes1[]bytesbytes1[] 省gas。

创建数组的规则

在solidity里,创建数组有一些规则:

  • 对于memory修饰的动态数组,可以用new操作符来创建,但是必须声明长度,并且声明后长度不能改变。例子:
    // memory动态数组
    uint[] memory array8 = new uint[](5);
    bytes memory array9 = new bytes(9);
  • 数组字面常数(Array Literals)是写作表达式形式的数组,用方括号包着来初始化array的一种方式,并且里面每一个元素的type是以第一个元素为准的,例如[1,2,3]里面所有的元素都是uint8类型,因为在solidity中如果一个值没有指定type的话,默认就是最小单位的该type,这里 uint 的默认最小单位类型就是uint8。而[uint(1),2,3]里面的元素都是uint类型,因为第一个元素指定了是uint类型了,我们都以第一个元素为准。

下面的例子中,如果没有对传入 g() 函数的数组进行 uint 转换,是会报错的。

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.16 <0.9.0;

contract C {
    function f() public pure {
        g([uint(1), 2, 3]);
    }
    function g(uint[3] memory) public pure {
        // ...
    }
}
  • 如果创建的是动态数组,你需要一个一个元素的赋值。
    uint[] memory x = new uint[](3);
    x[0] = 1;
    x[1] = 3;
    x[2] = 4;

数组成员

  • length: 数组有一个包含元素数量的length成员,memory数组的长度在创建后是固定的。
  • push(): 动态数组拥有push()成员,可以在数组最后添加一个0元素,并返回该元素的引用。
  • push(x): 动态数组拥有push(x)成员,可以在数组最后添加一个x元素。
  • pop(): 动态数组拥有pop()成员,可以移除数组最后一个元素。

Example:
在这里插入图片描述

结构体 struct

Solidity支持通过构造结构体的形式定义新的类型。结构体中的元素可以是原始类型,也可以是引用类型;结构体可以作为数组或映射的元素。创建结构体的方法:

    // 结构体
    struct Student{
        uint256 id;
        uint256 score; 
    }

    Student student; // 初始一个student结构体

给结构体赋值的四种方法:

    //  给结构体赋值
    // 方法1:在函数中创建一个storage的struct引用
    function initStudent1() external{
        Student storage _student = student; // assign a copy of student
        _student.id = 11;
        _student.score = 100;
    }

Example:
在这里插入图片描述

     // 方法2:直接引用状态变量的struct
    function initStudent2() external{
        student.id = 1;
        student.score = 80;
    }

Example:
在这里插入图片描述

    // 方法3:构造函数式
    function initStudent3() external {
        student = Student(3, 90);
    }

Example:
在这里插入图片描述

     // 方法4:key value
    function initStudent4() external {
        student = Student({id: 4, score: 60});
    }

Example:
在这里插入图片描述

总结

这一讲,我们介绍了solidity中数组(array)和结构体(struct)的基本用法。下一讲我们将介绍solidity中的哈希表——映射(mapping)。

在这里插入图片描述

如果这份博客对大家有帮助,希望各位给作者一个免费的点赞👍作为鼓励,并评论收藏一下⭐,谢谢大家!!!
制作不易,如果大家有什么疑问或给作者的意见,欢迎评论区留言。

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

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

相关文章

软考证书可以评职称吗?怎么评?

软考是可以帮助评职称的&#xff0c;取得软考证书&#xff0c;就具备评职称的相应资格。 通过软考获得证书的人员&#xff0c;表明其已具备从事相应专业岗位工作的水平和能力&#xff0c;用人单位可根据工作需要从获得证书的人员中择优聘任相应专业技术职务&#xff08;技术员…

Python函数绘图与高等代数互融实例(三):设置X|Y轴文本标签|网格线

Python函数绘图与高等代数互融实例(一):正弦函数与余弦函数 Python函数绘图与高等代数互融实例(二):闪点函数 Python函数绘图与高等代数互融实例(三):设置X|Y轴|网格线 Python函数绘图与高等代数互融实例(四):设置X|Y轴参考线|参考区域 一: 设置X|Y轴文本标签 import num…

Python在工业自动化领域的应用详解

概要 当我们开始讨论在工业自动化应用中使用哪种编程语言时&#xff0c;通常我们会首先谈论IEC 61131-3标准中用于可编程逻辑控制器&#xff08;PLC&#xff09;的语言&#xff0c;比如经典的梯形图&#xff08;LD&#xff09;或结构化文本&#xff08;ST&#xff09;。对于机器…

OceanBase Docker体验

实验一&#xff1a;OceanBase Docker体验 通过 OceanBase Docker 容器&#xff0c;快速的体验 OceanBase 的 自动化部署过程&#xff0c;以及了解 OceanBase 集群安装成功后的目录特点和使用方法。 Docker镜像 实验环境 实验环境说明 1台OCP 5台OBSERVER aarch64 Kylin Lin…

【效率提升】maven 转 gradle 实战 | 京东云技术团队

一、灵魂三问 1、gradle 是什么&#xff1f; 一个打包工具&#xff0c; 是一个开源构建自动化工具&#xff0c;足够灵活&#xff0c;可以构建几乎任何类型的软件&#xff0c;高性能、可扩展、能洞察等。其中洞察&#xff0c;可以用于分析构建过程中数据&#xff0c;提供分析参…

龙讯LONTIUM LT8712EXI 国产芯片

1.描述 该LT8712EXI是一种高性能的类型-C/DP1.2HDMI2.0/VGA转换器&#xff0c;旨在连接一个USB类型C源或DP1.2源到一个VGA接收器&#xff0c;并高达两个HDMI2.0接收器同时。 该LT8712EXI集成了一个DP1.2兼容接收器&#xff08;MST能力&#xff09;&#xff0c;一个高速三通道…

浅谈SpringMVC的请求流程

目录标题 浅谈SpringMVC的请求流程SpringMVC的介绍SpringMVC的逻辑概念运行图解知识总结 浅谈SpringMVC的请求流程 对于SpringMVC而言重点是了解它的底层运行逻辑&#xff0c;从而可以根据其逻辑来进行实际业务的操作或者是利用原理增强业务的功能性&#xff0c;最终达到项目预…

免备案海外服务器有什么好处?

介绍一&#xff1a;了解海外服务器免备案的优点 免备案海外服务器是指在国外搭建网站服务器而不是在国内备案&#xff0c;这种模式可以带来一定的便利 。首先&#xff0c;海外服务器免备案可以使网站更加稳定&#xff0c;因为国外网络环境更加稳定&#xff0c;大多数国外服务 器…

并查集题目

并查集是一种十分常用并且好用的数据结构 并查集可以动态维护若干个不重叠的集合&#xff0c;支持合并与查询操作&#xff0c;是一种树形的数据结构 并查集的基础应用 村村通 对于这道题我们只需要求连通块的数量&#xff0c;然后将这几个联通快看成点&#xff0c;我们可以知…

【算法练习Day3】 移除链表元素设计链表反转链表

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 移除链表元素其他问题 设…

【LeetCode热题100】--53.最大子数组和

53.最大子数组和 使用动态规划&#xff1a; 状态定义&#xff1a;设动态规划列表dp&#xff0c;dp[i]代表以元素nums[i]为结尾的连续子数组最大和 转移方程&#xff1a;若dp[i-1]≤0,说明dp[i-1]对dp[i]产生负贡献&#xff0c;即dp[i-1]nums[i]还不如nums[i]本身大 初始状态&…

基于Python+Pygame实现一个俄罗斯方块小游戏【完整代码】

俄罗斯方块&#xff0c;一款起源于上世纪80年代的经典电子游戏&#xff0c;凭借简单的规则和独特的魅力&#xff0c;一跃成为全球家喻户晓的经典。你知道其实只需要一些基础的编程知识&#xff0c;就可以自己实现它吗&#xff1f;今天&#xff0c;我们将使用Python的Pygame库&a…

2023年前端流行什么技术和框架了?

Web前端三大主流框架有React、Vue.js和Angular&#xff0c;由于接触过Vue.js&#xff0c;接下来主讲最新的Vue3.0&#xff01; Vue3.0作为最新版本的Vue.js框架&#xff0c;拥有更强大的性能和更丰富的功能&#xff0c;为低代码开发平台注入了全新的活力。而JNPF快速开发平台作…

Anchor DETR

Anchor DETR(AAAI 2022) 改进&#xff1a; 提出了基于anchor的对象查询提出Attention变体-RCDA 在以前DETR中&#xff0c;目标的查询是一组可学习的embedding。然而&#xff0c;每个可学习的embedding都没有明确的意义 &#xff08;因为是随机初始化的&#xff09;&#xff…

2024年天津专升本文化课考试大纲发生了哪些变化

2024年天津专升本文化课考试语文、数学、计算机、英语最新大纲发生了哪些变化 高职升本科《计算机应用基础》大纲更改详解:新增计算机发展新技术、win7变更为 win10、word2010变为word2019、 新 增其他常用功能模块、Excel2010变 更为Excel2019、新增演示文稿制作软件PowerPoi…

iPhone15线下购买,苹果零售店前门店排长队

今年的苹果新品发布会于北京时间 9 月 13 日凌晨举行&#xff0c;并于 9 月 15 日&#xff08;周五&#xff09;开启订购&#xff0c;9 月 22 日&#xff08;周五&#xff09;起正式发售。 据多位网友反馈&#xff0c;首批苹果 iPhone15 系列手机、Apple Watch Ultra 2 / Seri…

VBA技术资料MF59:从二维变体数组中删除一行数据

【分享成果&#xff0c;随喜正能量】小小的善业&#xff0c;能赢来大的利益&#xff0c;小小的恶业&#xff0c;同样也能招致严重的后果。这正如古语所云&#xff1a;“莫以善小而不为&#xff0c;莫以恶小而为之。。 我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效…

【数据库】Sql Server 2022通过临时表和游标遍历方式逻辑处理获取目标数据

2023年&#xff0c;第39周。给自己一个目标&#xff0c;然后坚持总会有收货&#xff0c;不信你试试&#xff01; 今天有个小伙伴咨询一个Sql Server处理数据的问题&#xff0c;刚好重温下SqlServer临时表和游标的知识点 目录 一、需求点描述二、临时表2.1、局部临时表&#xff…

计算机网络相关知识点

谈一谈对OSI七层模型和TCP/IP四层模型的理解&#xff1f; 这两种模型都是网络通信中重要的参考模型,他们的设计和功能有一些区别。 首先OSI&#xff0c;OSI七层模型&#xff0c;也被称为开放系统互联参考模型&#xff0c;是一种在国际标准化组织&#xff08;ISO&#xff09;中…

网络知识——局域网和交换机

定义&#xff1a; 局域网&#xff08;Local Area Network&#xff0c;简称LAN&#xff09;是指在某一区域内由多台计算机互联成的计算机组。广域网&#xff08;Wide Area Network&#xff0c;简称WAN&#xff09;是指跨越单个建筑物或大型园区&#xff0c;连接分布在特定地理区…