众所周知,以太坊开发拥有四种境界:金刚境,指玄境,天象境以及陆地神仙。今天我们继续来学习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。
下面我们就来演示获取结构体的值。
在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方法可以附加新的元素到数组末尾,返回值是新的长度。