这里拿java来进行对比一下,java和solidity都是面向对象的编程语言,也都是静态类型的。所以写过java的再写solidity上手会比较快。因为很多概念都是相通的,但是也不要大意,solidity还是有些小坑在里面的。我们需要理清楚这些数据类型在使用时的注意事项、操作技巧、变量在赋值传参时是值拷贝还是引用传递,以及如何省钱?

一、bool、uint(uint8、uint16、uint32、…、uint256)

基础数据类型没什么看头,和java差不多。

二、address 、address payable

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中赋值传参时,到底进行的是值拷贝?还是传递指针?我们该如何区分呢?