区块链技术学习-深入浅出区块链研习社区块链世界已经开启

智能合约语言 Solidity 教程系列6 - 结构体与映射

2018-01-27  本文已影响91人  ff045813a1c3

汇新云】为大家定期更新文章,【汇新云】IT人的产业链平台


Solidity 教程系列第6篇 - Solidity 结构体与映射。

写在前面

Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊、智能合约有所了解,

如果你还不了解,建议你先看以太坊是什么

本系列文章一部分是参考Solidity官方文档(当前最新版本:0.4.20)进行翻译,另一部分是Solidity深入分析,这部分请订阅区块链技术专栏阅读。

结构体(Structs)

Solidity提供struct来定义自定义类型,自定义的类型是引用类型。

我们看看下面的例子:

上面是一个简化版的众筹合约,但它可以让我们理解structs的基础概念,struct可以用于映射和数组中作为元素。其本身也可以包含映射和数组等类型。

不能声明一个struct同时将自身struct作为成员,这个限制是基于结构体的大小必须是有限的。

struct可以作为mapping的值类型成员。

注意在函数中,将一个struct赋值给一个局部变量(默认是storage类型),实际是拷贝的引用,所以修改局部变量值的同时,会影响到原变量。

当然,也可以直接通过访问成员修改值,而不用一定赋值给一个局部变量,如campaigns[campaignID].amount = 0

映射(Mappings)

映射类型,一种键值对的映射关系存储结构。定义方式为mapping(_KeyType => _KeyValue)。键类型允许除映射、变长数组、合约、枚举、结构体外的几乎所有类型()。值类型没有任何限制,可以为任何类型包括映射类型。

映射可以被视作为一个哈希表,所有可能的键会被虚拟化的创建,映射到一个类型的默认值(二进制的全零表示)。在映射表中,并不存储键的数据,仅仅存储它的keccak256哈希值,这个哈希值在查找值时需要用到。

正因为此,映射是没有长度的,也没有键集合或值集合的概念。

映射类型,仅能用来作为状态变量,或在内部函数中作为storage类型的引用。

可以通过将映射标记为public,来让Solidity创建一个访问器。通过提供一个键值做为参数来访问它,将返回对应的值。

映射的值类型也可以是映射,使用访问器访问时,要提供这个映射值所对应的键,不断重复这个过程。

来看一个例子:

注意:

映射并未提供迭代输出的方法,可以自行实现一个这样的数据结构。参考iterable mapping

参考文档

Solidity官方文档


学好区块链,拥抱新未来:

区块链产品经理(点击入驻),和圈内人士混个脸熟

上一篇下一篇

猜你喜欢

热点阅读