【solidity二】固定长度数组、动态长度数组、字符串之间的转换、solidity字典hash表的使用、solidity——memory、storage使用注意项、solidity状态变量、局部变量

四、 引用类型介绍

1. 不定长字节数组(bytes)

bytes -> []byte

  • 动态字节数组
  • 引用类型(表明可以使用storage来修饰,进行引用传递,指针的效果)
  • 支持下标索引
  • 支持lengthpush方法**(push会帮助分配空间的)**
  • 可以修改
  • 以十六进制格式赋值: ‘h’ -> 0x68 -> 104
  • 格外注意:对于bytes,如果不使用下标访问,那么可以不用先申请空间, 直接赋值即可,或者直接push

2. 字符串(string)

  • 动态尺寸的UTF-8编码字符串,是特殊的可变字节数组
  • 引用类型
  • 不支持下标索引
  • 不支持length、push方法
  • 可以修改(需通过bytes转换)

3. 数据位置(Data location)

复杂类型,不同于之前值类型,占的空间更大,超过256字节,因为拷贝它们占用更多的空间,如数组(arrays)数据结构(struct),他们在Solidity中有一个额外的属性,即数据的存储位置:memorystorage

- 内存(memory)

  • 数据不是永久存在的,存放在内存中,越过作用域后无法访问,等待被回收。
  • 被memory修饰的变量是直接拷贝,即与上述的值类型传递方式相同。

- 存储 (storage)

  • 数据永久保存在。
  • 被storage修饰的变量是引用传递,相当于只传地址,新旧两个变量指向同一片内存空间,效率较高,两个变量有关联,修改一个,另外一个同样被修改。
  • 只有引用类型的变量才可以显示的声明为storage

- 状态变量

状态变量总是stroage类型的,无法更改

- 局部变量

默认是storage类型(仅限数据结构或数组,string),但是可以声明为memory类型。

4. 转换(bytes1/bytes/string)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nT1YB0VF-1652791388966)(../../mdPicFile/image-20220517202850060.png)]

5. 数组

- 内置数组

  • string(不定长)
  • bytes(不定长)
  • bytes1…bytes32(定长)

- 自定义数组

定长数组

go numbers [10] uint

  • 类型T,长度K的数组定义为T[K],例如:uint [5] numbers, byte [10] names;
  • 内容可变
  • 长度不可变,不支持push
  • 支持length方法

不定长数组

  • 定义格式为T [ ],例如:string[ ] names, byte[ ] citys。
  • 内容可以修改
  • 可以改变长度(仅限storage类型) 支持lengthpush方法
  • memory类型的不定长数组不支持修改长度
  • 即使没有手动分配空间,直接改变长度,那么也会自动分配空间

6. 结构体

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract Test {
    //定义结构之后无分号,与枚举一致
    struct Student {
        string name;
        uint age;
        uint score;
        string sex;
    }

    Student[] public students;

    //两种赋值方式
    Student public stu1 = Student("lily", 18, 90, "girl");
    Student public stu2 = Student({name:"Jim", age:20, score:80, sex:"boy"});

    function assign() public {
        students.push(stu1);
        students.push(stu2);

        stu1.name = "Lily";
    }
}

7. 字典/映射/hash表(mapping)

  • 键key的类型允许除映射外的所有类型,如数组,合约,枚举,结构体,值的类型无限制。
  • 无法判断一个mapping中是否包含某个key,因为它认为每一个都存在,不存在的返回0或false。
  • 映射可以被视作为一个哈希表,在映射表中,不存储键的数据,仅仅存储它的keccak256哈希值,用来查找值时使用。
  • 映射类型,仅能用来定义状态变量,或者是在内部函数中作为storage类型的引用。
  • 不支持length
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;


contract Test {
    mapping(string => string)public id_name;
    
    function initMapping()public {
        id_name["a"] = "yida1";
        id_name["b"] = "yida2";
        id_name["c"] = "yida3";
        id_name["c"] = "yida";
    }
}

猜你喜欢

转载自blog.csdn.net/qq_40585384/article/details/124829623