简要说明
本节简单介绍基本数据类型和一些基本的关键字,数组的简单使用。知识点的说明会直接通过代码注释的方式来展示,接下来,直接show you the code
show you the code
DataTypeOne.sol
pragma solidity >=0.7.0 <0.9.0;
/**
基本数据类型:
固定长度:
bool
uint
adress
bytes32:其实还有bytes1 bytes2 bytes3等等。。 一旦你声明了bytesn 则该变量的length属性即为n
变长:
bytes: 类似于byte[]
数组类型: uint[] bytes32[]
mapping
string: 等同于bytes,但是不允许使用长度(没有length属性)或者索引进行访问
自定义
enum
struct
函数的修饰词:
public: 可以内部或者外部调用
external: 仅可外部调用
internal: 可内部或者子合约调用
private: 仅可内部调用
变量的作用域:
storage: 全局的 直接写在合约属性范围域的,或者在函数内部使用storage关键字声明
memory: 函数范围的,每次运行都重新生成
*/
contract DataTypeOne {
uint value;
uint[] storageArr;
bytes3 a; // 声明字符串a 该字符串的长度最大为3 类似于数据库中的varchar定义
address ar;
string str;
mapping(uint => address) map;
function getValue() external view returns(uint) {
return value;
}
function setValue(uint _value) external {
a = "12";
uint[] storage innerStorage ;
value = _value;
}
function initStorageArray() external {
storageArr.push(10);
storageArr.push(1);
// 需要注意两点
// 1. 对于没有声明长度的storage数组,如果要增加数组长度,则只能通过push的方法来实现 storageArr[n]这种方式只能修改当前长度内的元素,不能新增一个元素,否则会数组越界报错
// 2. 因为storage范围的数组的作用域是整个区块链的,所以该方法每调用一次,都会依次往数组后面加上10,1 两个元素
// storageArr[1] = 1;
storageArr[1] = 5;
delete storageArr[0]; // 不会删除元素,只是将该位置的元素的设置为对应数据类型的默认值 uint即为0
}
function getStorageArr() external view returns(uint[] memory) {
return storageArr;
}
/**
* pure和view关键字的区别:
pure既不能修改区块链变量,也不能读取区块链变量,即只能处理memory范围的变量
view则只是不能修改,可以读取
数组作为函数参数和返回值:
作为函数传入参数时需要用 calldata来修饰
作为返回值需要用 memory来进行修饰
*/
function getMemoryArr() external pure returns(uint[] memory) {
uint[] memory memoryArr = new uint[](10);
// memoryArr.push(1); // memory类型的数组必须要在初始化的时候指定长度,且不支持push的方式来增加数组长度
memoryArr[0] = 10;
memoryArr[9] = 11;
return memoryArr;
}
function getBytesLen() external view returns (uint) {
a[1]; // 可以通过下标访问对应的字符
return a.length; // 此时输出3
}
}