以太坊中Solidity行 · 大金刚境:语法详解#结构体与一维数组

1,658 阅读3分钟

「这是我参与2022首次更文挑战的第8天,活动详情查看:2022首次更文挑战」。

以太坊中Solidity行 · 大金刚境:语法详解#结构体与一维数组

众所周知,以太坊开发拥有四种境界:金刚境,指玄境,天象境以及陆地神仙。今天我们继续来学习Solidity的语法来深造大金刚境界。

一、结构体

我们先来看一看C、Go里面都有的结构体吧~

 contract Struct{
     struct Bank{
         address addr;
         uint balance;
         Person p;
     }
 ​
     struct Person{
         string name;
         int age;
         string sex;
     }
 ​
     Person p1 = Person({
         name: "ReagnYue",
         age:21,
         sex:"female"
     });
 ​
     Bank b = Bank(
         0xA507E286b9F230801A5d0BD9F3940EAE0DC22fd8,
         888,
         p1
     );
 }
 ​

上面是在solidity中编写两种结构体,并初始化两个结构体。这里我们需要注意的是,这里我们初始化结构体时,采用命名方式初始化,在小括号后面还有一个花括号。而我们初始化Bank结构体时的那样,按成员顺序进行初始化,就不需要在小括号后面再添加一个花括号了,只需要小括号即可。

接下来我们来看看如何获取结构体的值。

     function getBank() public returns(address,uint,string memory,int,string memory){
         return (b.addr,b.balance,b.p.name,b.p.age,b.p.sex);
     }

我们可以通过一个函数来获取结构体的值,你会不会有疑惑为什么返回值不能直接返回结构体?这是因为solidity的结构体现在只能够在合约之内使用或者在继承合约内使用,若要在参数以及返回值之中使用结构体,这个函数一定需要声明internal。

下面我们就来演示获取结构体的值。

image-20220129181108619

二、一维数组

在solidity中,数组分为定长数组和变长数组。对于storage类型的数组来说,其元素类型可以为所有的类型,而如果是memeory类型的数组,其元素的类型与其函数的可见性存在关系。

我们先来介绍一下定长数组的有关操作:

 contract StaticArray {
     uint[5] array = [1,8,7,8,6];
     
 ​
     function getArray() view public returns(uint[5]) {
         return array;
     }
 ​
 ​
     function update(uint index, uint value)public {
         array[index] = value; 
     }
 ​
 ​
     function query(uint index) view public  returns(uint) {
         return array[index];
     }
 ​
 ​
     function getLength() view public returns(uint) {
         return array.length;
     }
     
     
 }

这里介绍了定长数组的4中操作,获取数组,更新数组元素,查询数组某个元素,获取数组的长度。需要注意的是,在老版本中对于数组的length属性,定长数组不可修改,而不定长数组是可以修改这一属性的。而在新版本中,这个属性是只读的,似乎是不能修改的。

接下来我们再来看一看不定长数组的操作:

 contract DArr {
     uint[] a = [2,2,3,8,1];
     uint[] a2 = new uint[](10); 
 ​
 ​
     function append(uint value) public {
         a.push(value);
     }
   
   
     function update(uint index, uint value) public {
         a[index] = value; 
     }
 ​
     
     function getLength() public view returns(uint) {
         return a.length;
     }
     
     
 }

不定长数组的初始化有两种。如上第二行和第三行代码。

然后与定长数组不同的是,它的添加元素操作,这里主要是通过push来添加元素。通过push方法可以附加新的元素到数组末尾,返回值是新的长度。