华企号 后端开发 mapping的原理

mapping的原理

·所有的value都会被初始化成“预设值”。

·原因是在以太坊的空间上,所有未初始化的空间,都是0,换言之就是每个型态被迪定义的“预设置”。

·Key并不会被存在mapping型态里,因此使用者没办法从mapping中取得所有的Key

·那他是怎么查询的呢?

·keccak256(Key)→Value

·因此,mapping没有办法记录长度、大小、在没有key的情况下也不能列出所有的value

Example:学号与成绩

·建立一份合约class

·建立一个映射,将学号映射到成绩中:

·学号uint

·成绩uint

·提供一个函数update来更新学生成绩

·update(uint student_id,uint score)

·提供一个函数getScore来取得学生成绩

·get(uint students_id) → uint score

代码示例:

 mapping的原理插图

//SPDX-License-Identifier:MIT pragma solidity ^0.8.17; contract Class { mapping(uint => uint) Students; function update(uint id,uint score) public { Students[id] = score; } function set(uint id) public view returns(uint) { return Students[id]; } }

六、循环体:

控制结构

Control Structure

前言:在程序中会遇见同一件事情需要用很多次,需要重复很多次,这时不可能将代码复制很多次,就需用“控制结构”进行控制。

·关键词:if

·当满足“条件”的时候,则执行“{}内的代码”

·条件必须是个“布尔值”

·也就是逻辑判断,如:未满十八岁、是否高于最低薪资、论文有无抄袭、参考资料有无正确引用等。

若“000”,则“XXX”,否则“ZZZ”

if(条件){/*做点事儿*/} else{/*做点儿别的事儿*/}

·关键字:if-else

·当满足“条件”的时候,则执行“{}内的代码”

·若不满足“条件”则执行“else{}内的代码”

很多条件的情况

if(条件A){} else if (条件B){}……

·关键字:if-(else-if)*-else

·当有多个条件时,可以排序多个条件,else不一定要有

Example:成绩计算(if)

mapping的原理插图1

//SPDX-License-Identifier:MIT pragma solidity ^0.8.17; contract Class { //声明一个列表然后将值赋予列表 uint[] Scores = [90,91,92,93,94]; //定义一个函数X,这个函数公开可见可读可写,作用是返回一个无符号整数,输出元素计算总和,同时index自加一直到预设条件 function X() public view returns(uint) { //这里将Sum预设值归零 uint Sum = 0; //这里将index预设值归零 uint index = 0; //这里开始while循环体 while (index < 5) { //这里是Sum将Score中的每一个元素输出并相加 Sum = Sum + Scores[index]; //index自加确保在列表元素输出完后,能够跳出循环 index++; } //最终返回总和 return Sum; } }

 

重复做事 for

for (宣告;条件;事后修改的事) {/*做点事儿*/}

·关键字:for(  ;  ;  ){}

·在满足条件下,重复执行{}内的代码。

·宣告:

·循环事实上就是计数器,因此宣告是为了帮助我们制造出计数器的变数,计数器不一定是整数,只要能被利用在“条件判断中”的型态都可以使用。

·要遍历阵列的所有元素:for (uint index;  ;  )  {……}

·条件:同if

·事后修改的事:比如说增加计数器等修改的行为。

·若“条件”没写,则为一个“无限循环”是停不下来的。

Example:统计学生成绩(for)

mapping的原理插图2

//SPDX-License-Identifier:MIT pragma solidity ^0.8.17; contract Class { uint[] Score = [90,91,92,93,94]; function X() public view returns(uint) { //声明一个Sum变量,将其预设值归零 uint Sum = 0; //这里for循环结构是(宣告;条件;事后修改的值){执行代码} //事实上这里宣告就是声明一个可以结束循环体的循环控制值 for ( uint index = 0;index < 5;index++ ) { Sum = Sum + Score[index]; } return Sum; } }

 

重复做事 while

·关键字:while( ) { }

·在特定条件下,重复执行{ }内的代码。

·条件:同if

·若“条件”没写,则为一个“无限循环”是停不下来的。

Example:统计成绩(while)

mapping的原理插图3

//SPDX-License-Identifier:MIT pragma solidity ^0.8.17; contract Class { uint[] Score = [90,91,92,93,94]; function X() public view returns(uint) { //声明一个Sum变量,将其预设值归零 uint Sum = 0; //这里for循环结构是(宣告;条件;事后修改的值){执行代码} //事实上这里宣告就是声明一个可以结束循环体的循环控制值 for ( uint index = 0;index < 5;index++ ) { Sum = Sum + Score[index]; } return Sum; } }

离开当前循环 break

break

·关键字:break

· 跳出当前循环

·若嵌套状态,如for( ){for( ){for( ){ } } },就需要三个break。

 

跳出本次循环 continue

continue

·关键字:continue;

·跳过本次循环

·在“for”时,跳过以后会执行“事后修改的事”;

·在“while”时,就会跳回条件判断

·当执行到continue的时候,会无条件跳过continue后的代码。

作者: 华企网通王鹏程序员

我是程序员王鹏,热爱互联网软件开发和设计,专注于大数据、数据分析、数据库、php、java、python、scala、k8s、docker等知识总结。 我的座右铭:"业精于勤荒于嬉,行成于思毁于随"
上一篇
下一篇

发表回复

联系我们

联系我们

028-84868647

在线咨询: QQ交谈

邮箱: tech@68v8.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部