Solidity: общие структуры данных
Solidity: общие структуры данных

В Solidity существует множество структур данных, используемых для организации и обработки информации. Ниже приведены некоторые из наиболее часто используемых структур данных.

1. Array

существовать Solidity , множество (Массив) — базовая структура данных,Он может хранить несколько элементов одного типа.,Порядок элементов существующего множества определяется значением их индекса. в соответствии с заданной длиной,множество Можно разделить на два типа:фиксированная длинаидинамичный。правильныйфиксированная длинастепеньмножествосуществовать Фиксированный размер при создании,После этого его нельзя изменить; «динамичное множество» не имеет фиксированной длины.,Элементы можно добавлять или удалять.

создать массив

Статический массив создается следующим образом, где <Type> это тип данных элемента,<Size> длина массива:

Язык кода:javascript
копировать
<Type>[<Size>] arrayName;

Например,Создайте длину5И тип элементаuintизмножество,Его можно создать следующим образом:

Язык кода:javascript
копировать
uint[5] myArray;

Для динамических массивов они создаются следующим образом:

Язык кода:javascript
копировать
<Type>[] arrayName;

Например,Создайтединамичныймножество,Тип элементаuint

Язык кода:javascript
копировать
uint[] myArray;

Доступ и изменение элементов массива

существовать Solidity , к элементам массива можно получить доступ или изменить их с помощью индекса массива (начиная с 0). Например:

Язык кода:javascript
копировать
myArray[0] = 10;  // Измените значение первого элемента из числа до 10.
uint firstElement = myArray[0];  // Доступ к первому элементу из множества

Свойства и методы массива

Для массивов есть некоторые часто используемые свойства и методы:

lengthсвойство:возвращатьсямножествоиздлина。•pushметод:относится только кдинамичныймножество,Используется для добавления элемента в конец существования множество.,в то же времямножествоиздлина会增加1。•popметод:относится только кдинамичныймножество,Используется для удаления последнего элемента из множества,В то же время длина множества уменьшится на 1.

подиз Примерсерединапоказывает, каксуществовать Solidity Используйте динамические массивы в:

Язык кода:javascript
копировать
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;

contract Test {
    uint[] public numArray;

    // Добавляйте элементы во множество
    function addToArray(uint num) public {
        numArray.push(num);
    }

    // Получить длину множества
    function getArrayLength() public view returns (uint) {
        return numArray.length;
    }

    // Получить элементы из множества на основе индекса
    function getElement(uint index) public view returns (uint) {
        return numArray[index];
    }

    // Удалить последний элемент из множества
    function removeLastElement() public {
        numArray.pop();
    }
}

2. Struct

существоватьSolidityсередина,Struct — сложный тип данных.,Позволяет объединить несколько переменных разных типов в одну сущность.

Основной синтаксис создания структуры следующий:

Язык кода:javascript
копировать
struct StructName {
    Type1 variable1;
    Type2 variable2;
    ...
}

Среди них «StructName» — это имя, определенное вами для структуры, «Type1» и «Type2» — это типы данных переменных (таких как uint, адрес, строка и т. д.), а «variable1» и «variable2». — имена этих переменных.

Ниже приведен конкретный пример определения структуры:

Язык кода:javascript
копировать
struct Student {
    uint id;
    string name;
    uint age;
}

существуют После определения структуры,Вы можете создать новый экземпляр структуры,и инициализировать его значение。Например:

Язык кода:javascript
копировать
Student memory newStudent = Student({
    id: 1,
    name: "Alice",
    age: 20
});

Уведомление,существуют В блоке кода выше,Ключевое слово «память» является обязательным.,Указывает, что этот экземпляр структуры хранится в памяти.

Вы также можете напрямую обращаться к переменным-членам структуры и изменять их. Например:

Язык кода:javascript
копировать
newStudent.name = "Bob";  // Измените поле «имя» в экземпляре структуры.
string studentName = newStudent.name;  // Доступ к полю «имя» в экземпляре структуры

кроме того,Вы также можете отобразить структуру хранилищасуществовать множество или отобразить,для достижения более сложныхиз Управление данными。Например:

Язык кода:javascript
копировать
// хранилищесуществоватьмножествосередина
Student[] public students;

// отображение хранилищасуществовать, где адрес является ключом, а структура Student — значением
mapping(address => Student) public studentInfo;

В следующем примере показан простой сценарий использования Struct:

Язык кода:javascript
копировать
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;

contract StructExample {
    struct Student {
        uint256 id;
        string name;
        uint256 age;
    }

    Student[] public students;

    function addStudent(
        uint256 _id,
        string calldata _name,
        uint256 _age
    ) public {
        // 3 метода инициализации
        // 1. Как и при вызове функции, порядок формальных параметров во время инициализации должен соответствовать порядку полей структуры.
        students.push(Student(_id, _name, _age));

        // // 2. key => форма стоимости
        // students.push(Student({id: _id, name: _name, age: _age}));

        // // 3. Использовать временную переменную
        // Student memory stu;
        // stu.age = _age;
        // stu.id = _id;
        // stu.name = _name;
        // students.push(stu);
    }

    function getStudent(uint256 _index)
        public
        view
        returns (
            uint256,
            string memory,
            uint256
        )
    {
        Student memory stu = students[_index];
        return (stu.id, stu.name, stu.age);
    }
}

3. Mapping

существовать Solidity В языке Mapping — это структура данных, которая связывает значения (ключи) одного типа со значениями (значениями) другого типа, аналогично хеш-таблицам или словарям во многих языках программирования. Ключевым типом карты может быть любой базовый тип, включая байтовые и целочисленные типы, но не могут быть карты, динамические массивы, контракты, перечисления и структуры. Ограничений на тип отображаемого значения практически нет, и это может быть даже другая карта.

Ниже приведен основной синтаксис для создания карты:

Язык кода:javascript
копировать
mapping(_KeyType => _ValueType) public mappingName;

существоватьздесь,_KeyTypeэто ключизтип данных,_ValueTypeдаценитьизтип данных,иpublicКлючевые слова позволяют использовать сопоставление вне контрактов.изчтение программы(но не может быть изменено)。

Приведите пример,Следующий код создает файл с именемbalancesизкартографирование,Он сопоставляет адрес сuintценить:

Язык кода:javascript
копировать
mapping(address => uint) public balances;

существуют После создания отображения,Можно использоватьсерединаскобки[]来访问或修改картографированиесерединаизэлемент,

Язык кода:javascript
копировать
balances[address1] = 100;  // Установить адрес адрес1 Баланс 100 
uint balance = balances[address1];  // Получить адрес адрес1 баланс

нуждаться Уведомлениеизда,Отображение существования По умолчанию все ключи сохраняются существующими, а соответствующие значения по умолчанию равны начальному значению типа.,нравитьсяпереписыватьсяuintиз默认да0,переписыватьсяboolиз По умолчаниюfalse

Вот более полный пример контракта Solidity, который использует сопоставление для управления балансами счетов:

Язык кода:javascript
копировать
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;

contract MyContract {
    // Определите сопоставление для определения баланса, соответствующего каждому адресу.
    mapping(address => uint) public balances;

    // депозит
    function deposit(uint amount) public {
        // Увеличить баланс отправителя
        balances[msg.sender] += amount;
    }

    // Получить баланс
    function getBalance() public view returns (uint) {
        return balances[msg.sender];
    }
}

4. Enum

существоватьSolidityсередина,Тип перечисления (enum) — это специальный тип, определенный разработчиком.,Это позволяет вам создавать предопределенный набор значений. Перечисление можно рассматривать как тип с ограниченными значениями.,Это помогает сделать код более понятным и понятным.,Уменьшите количество ошибок.

Ниже приведен основной синтаксис для определения типа перечисления:

Язык кода:javascript
копировать
enum EnumName {
    Value1,
    Value2,
    ...
}

существоватьздесь,«EnumName» — это имя, которое вы определили для перечисления.,«Значение1» и «Значение2» и т. д. — это значения в перечислении.

Вот пример фактического определения перечисления:

Язык кода:javascript
копировать
enum State {
    Created,
    Locked,
    Inactive
}

существовать Этот примерсередина,State — имя перечисления, а CreatedLocked и Inactive — значение в этом перечислении.

После определения типа перечисления,Вы можете создать переменную этого типа в контракте существования.,и установите его в это перечислениесерединаизценить。Например:

Язык кода:javascript
копировать
State public state = State.Created;

существует В приведенном выше фрагменте кода есть публичный State типизсостояниепеременная,этоизисходныйценитьустановлено наCreated

Вы также можете изменить или проверить переменную этого типа перечисления в функции контракта существования:

Язык кода:javascript
копировать
function makeInactive() public {
    state = State.Inactive;  // Изменить значение перечисления переменная
}

function checkState() public view returns(bool) {
    return state == State.Inactive;  // Проверьте значение перечисления переменная
}

Отказ от ответственности: эта работа распространяется под лицензией Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)[1]. Пожалуйста, укажите источник при ее использовании. Автор: мэнбин[2] блог: мэнбин[3] Гитхаб: mengbin92[4] cnblogs: Непреднамеренно полюбила воду[5] Сообщество разработчиков облачных технологий Tencent: Мюнстер[6]

References

[1] С указанием авторства-Некоммерческая-ShareAlike 4.0 интернациональность (CC BY-NC-SA 4.0): https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh [2] mengbin: mengbin1992@outlook.com [3] mengbin: https://mengbin.top [4] mengbin92: https://mengbin92.github.io/ [5] Влюбляюсь в воду нечаянно: https://www.cnblogs.com/lianshuiwuyi/ [6] Мюнстер: https://cloud.tencent.com/developer/user/6649301

boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.