Solidity 结构体 struct

类似于C语言,solidity 也有结构体 struc 类型,用于表示复合型数据。

结构体 struc 类型是引用类型。

例如,一本书的信息:

  • Title
  • Author
  • Book ID
  • Owner

就可以用结构体来表示。

 

1. 定义结构体

要定义结构,使用struct关键字。struct关键字定义了一个新的数据类型,包含多个成员。struct语句的格式如下

struct struct_name { 
   type1 type_name_1;
   type2 type_name_2;
   type3 type_name_3;
}

示例

struct Book { 
   string title;
   string author;
   uint book_id;
}

 

2. 访问结构体成员

要访问结构的任何成员,使用成员访问操作符(.)。

示例

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SolidityTest {
   struct Book { 
      string title;
      string author;
      uint id;
   }
   Book book;

   function setBook() public {
      book = Book('Learn Java', 'codebaoku.com', 1);
   }
   function getBookAuthor() public view returns (string memory) {
      return book.author;
   }
}

运行上述程序,先单击 setBook 按钮,然后单击 getBookAuthor 获取图书 Author。

输出结果:

string: codebaoku.com

 

3. 结构体操作方法

结构体变量共有三种初始化方式。我们还可以定义结构体数组、结构体状态变量,并对其进行操作。

示例

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SolidityTest {
   struct Book { 
      string title;
      string author;
      uint id;
      address owner;
   }

   Book public book;
   Book[] public books;
   mapping(address=>Book[]) public booksByOwner;

   function operations() external {
        // 结构体直接按照字段顺序,进行初始化
        Book memory book1 = Book('Learn Java', 'codebaoku.com', 1, msg.sender);

        // 结构体按照字段名,进行初始化
        Book memory book2 = Book({title:'Learn JS', author:'codebaoku.com', id:2, owner:msg.sender});

        // 结构体按照默认值,进行初始化
        Book memory book3;
        book3.id = 3;
        book3.title = 'Learn C';
        book3.author = 'codebaoku.com';
        book3.owner = msg.sender;

        // 结构体数组操作
        books.push(book1);
        books.push(book2);
        books.push(book3);

       // 结构体状态变量操作
       Book storage _book = books[0];
       delete _book.id;
       delete books[0];
       _book.id = 100;
   }
}

Solidity 映射 mapping 用于以键值对的形式存储数据,等同于其它编程语言的哈希表或字典。映射 mapping 是智能合约中很常用的一种数据类型,它是引用类型。下面是声明映射类型的语法。m ...