Web3——Solidity基础

Solidity的数据类型

Solidity最基础的四种数据类型:boolean,uint,int 和 address

bytes 是一种更底层的数据类型,bytes32是bytes允许分配的最大空间
boolean定义true和false
unit无符号整数,表示这个数字不是可正可负的,只能是正数,而且可以决定给它分配空间,其实就是有多少存储分配给了这个数字,他就可以有多大,如果写uint8就是分配了8个bit.,如下

uint8 favoriteNum = 123;
string str =123”
Int256 faint = -123
address myaddr = “xxxxxxxxxxxx”
bytes32 fabytes = “cat” // “cat”是一个string但是可以自动转化为bytes

最大是uint256,如果不赋值,默认就是uint256, 对于uint来说最低是设置8个bit,因为8bit是一个byte,我们按照byte来增加空间。比如uint8,uint16,uint32等等,知道uint256最大,不赋值是默认是0
int表示正数或者负数
address 表示地址

Solidity函数

函数或者方法指的是独立的模块,在我们调用的时候执行的某些指令。和JavaScript的函数是一样的。通过“function”表示。
函数和变量有4钟可见度标识符,它们是public,private,external和internal

public在外部可内部都可见。任何与合约交互的人都可以看到public标识的变量中存的值。Public会创建storage和state变量的getter函数。

uint256 public favorNum;

给favorNum加上public,实际上就是给favorNum创建了getter函数。返回了favorNum的值。
private表示只有在这个合约中可以调用这个函数,
external表示只对合约外部可见。表示合约外的账户可以调用。
internal表示只有这个合约或者继承它的合约可以读取,默认是internal

struct 结构体

通过struct 可以创建一个关于人物的“结构体”,

struct People{
    
    
	Uint256 age;
	String name;
}

现在就有People类型可以提供使用。命名为person,因为我们把它 做成了一个结构体,所以在这里要添加{},这样才能让solidity知道使用的是这些结构体的变量。

People public person = People({
    
     age:24,name:”zhangsan”});

数组(array)是一种创建列表方法的数据结构,数据是存储列表,也可以说存储一系列对象的一种方式。创建一个数组的方法和初始化其他类型一样。通常先声明对象的类型,其次是对象的可见性,最后是变量名。如下:”[]”表示数组

People[] public people;// 没指定大小,表明大小是任意的,是动态数组
People[3] public people;// 最多只能放进去三个People对象。
People memory newperson = People({
    
     age:24,name:”zhangsan”}); // 变量的数据类型必须是“storage”,“memory”,或者“calldata”
people.push(newperson );//通过push添加数据。

在Solidity中有6钟方式可以存储数据

1、Stack
2、Memory
3、Storage
4、Calldata
5、Code
6、Logs.

“memory”和“calldata”意味着这个变量只是暂时存在,calldata不能被修改为临时变量,memory可以被修改为临时变量。
“storage”存在于正在执行的,甚至于存在执行函数之外。storage是可以被修改为永久变量的。

function addPerson(string memory name, uint256 age) public {
    
    
	people.push(People(name,age ));
}

数组结构在solidity中被认为是特殊的类型。Solidity可以自动知道unit256的位置,对于addPerson这个函数,Solidity知道uint256仅仅存在于内容中,但是Solidity不确定string会是什么。从原理上来说,一个string实际上是一个bytes数组。由于string是一个数组,所以需要加memory ,让solidity知道数组结构或者映射的数据位置。
注意:结构体、映射和数组作为参数被添加到不同的函数中时,需要给定一个memory”或者“calldata”关键字

Mapping映射

在People数组中如果有几百个数据,如果中找和其中一条,通过索引遍历的话效率很低,这时候我们就可以使用mapping映射,可以想象成一种字典,或者js,java里面的map是一组键值对的形式存储数据,每个key键返回与该键关联的value值。创建映射变量的方式与创建其他变量方式一样。

mapping(string => uint256) public nameToAge; 

每个名字都会映射到一个特定的age,添加人员到数组的时候也要添加到映射中

function addPerson(string memory name, uint256 age) public {
    
    
people.push(People(name,age ));
nameToAge[name] = age;
}

猜你喜欢

转载自blog.csdn.net/weixin_43506403/article/details/129767086