这里拿java来进行对比一下,java和solidity都是面向对象的编程语言,也都是静态类型的。所以写过java的再写solidity上手会比较快。因为很多概念都是相通的,但是也不要大意,solidity还是有些小坑在里面的。我们需要理清楚这些数据类型在使用时的注意事项、操作技巧、变量在赋值传参时是值拷贝还是引用传递,以及如何省钱?
基础数据类型没什么看头,和java差不多。
address类型是solidity自带的数据类型,类似java中自带的类。address类型有很多常用的成员函数。
// 定义address类型
address _walletAddress = 0x356faDD245d35ff8F1a207aC83BE7EEa911abeEE
// address类型的成员函数 把它想成java的类和对象
_walletAddress .balance() 返回地址余额
_walletAddress .transfer() 向地址发送以太币,失败时抛出异常。只会使用2300的gas
_walletAddress .send() 像地址发送以太币,失败时返回false.gas 使用无限制
// 特殊类函数
<address>.call() :通常用于合约交互,直接控制编码的方式调用合约函数。
会切换上下文,附加gas,附加value。 addr.call{value:1 ether}(””) 等价于transfer(1 ether),但是没有gas限制。失败不是发生异常,而是返回false,所以一定要检查返回值。
<address>.delegatecall()
保持上下文,不支持附加value{value: }
solidity中的contract就和java中class关键字一样。都是用来定义类型的,可以理解为合约就是java中的类。合约默认继承address,所以可以将显示转为address类型,这样就能使用address类型中的成员函数。
address(this).balance()
address(this).transfer(to,amount)
1、数组的循环
和java不一样,java中可以直接遍历一个超大的数组,而solidity中遍历超大型数组则无法直接遍历,需要点小技巧。
2**、数组如何删除某个元素?**
function remove(uint index) public {
// 获取数组长度
uint len = numbers.length;
// 用最后一个元素来覆盖index的数据实现删除效果。
if( index == len -1){
numbers.pop()
break;
}else {
numbers[index] = numbers[len - 1]
numbers.pop()
break;
}
}
和其他任何编程语言一样,在对变量进行赋值或传参时需要意识到当前是值拷贝还是引用传递(传递指针)
那在solidity中赋值传参时,到底进行的是值拷贝?还是传递指针?我们该如何区分呢?