solidity开发2-基本数据类型与数组入门

简要说明

本节简单介绍基本数据类型和一些基本的关键字,数组的简单使用。知识点的说明会直接通过代码注释的方式来展示,接下来,直接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
    }

}



上一篇:Hardhat 获取合约编译后的文件大小


下一篇:solidity开发2-合约结构