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
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose