solidity-06-枚举
枚举在数学和计算机科学理论中,是一个常用的类型,它让程序易读。 枚举类型 enum 内部就是一个自定义的整型,默认的类型为uint8,当枚举数足够多时,它会自动变成uint16。
枚举类型 enum可以与整数进行显式转换,但不能进行隐式转换。显示转换会在运行时检查数值范围,如果不匹配,将会引起异常。。
枚举是一个被命名的整型常数的集合,枚举在日常生活中很常见,例如“星期”这个词就是一个枚举,星期一、星期二、 星期三、星期四、星期五、星期六、星期日就是这个枚举里面的成员。
通俗来说,枚举就是对一个对象的所有可能取到的值的集合。[维基百科]
1234567891011121314pragma solidity ^0.8.0;contract enum_demo { enum Week { Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday} Week _week; constructor(Week week) public { _week=week; ...
solidity-05-数组
不可变长度数组声明12345pragma solidity ^0.8.0;contract FixArrayDemo{ uint [3] _nums = [1,2,3];}
获取数组长度和遍历数组12345678910111213pragma solidity ^0.8.0;contract FixArrayDemo{ uint [3] _nums = [1,2,3]; function AddOP() view public returns (uint) { uint result = 0; for (uint i=0;i<_nums.length;i++){ result += _nums[i]; } return result; }}
修改数组中的元素值123456789101112131415pragma solidity ^0.8.0;contract ArrayDemo{ ...
solidity-04-布尔
布尔取值就是 true 或 false。
支持的运算符:
&& 逻辑与
|| 逻辑或
! 逻辑非
== 等于
!= 不等于
123456789101112131415161718192021222324252627pragma solidity ^0.8.0;contract BoolOP { function and_op(bool x,bool y) public returns (bool){ return x && y; } function or_op(bool x,bool y) public returns (bool){ return x||y; } function not(bool x) public returns (bool){ if (!x){ return false; } return ...
solidity-03-字符串
字符串字符串可以通过””或者’’。 例:”solidity” 或者 ‘solidity’
12345678910111213pragma solidity ^0.8.0;contract Car { string name; constructor(string memory _name) public { name=_name; } function getName() view public returns (string memory){ return name; }}
字符串还可以隐式地转换成 bytes1,……, bytes32。
1bytes32 some = "solidity"
字符串字面常量只能包含可打印的ASCII字符,这意味着他是介于 0x20 和 0x7E 之间的字符。
Unicode 字面常量普通字符串文字只能包含ASCII,而Unicode可以包含任何有效的UTF-8序列。
1string hi = unicode ...
Solidity-整型
Int它是有符号类型,它可以表示正数和负数。 每次增加8位。int8 -127 127int16 -65535 65535…int256
Uint它是无符号类型,它只能表示正数(包括0)。每次增加8位。uint8 0 127uint16 0 65535…uint256
基本运算(+、-、*、/)12345678910111213141516171819pragma solidity ^0.8.0;contract Math { function add(int x, int y) pure public returns (int) { return x + y; } function sub(int x, int y) pure public returns (int){ return x-y; } function mul(int x,int y) pure public returns (int){ return x* ...
为什么要学习Solidity
以太坊2013年年末,以太坊创始人Vitalik Buterin发布了以太坊初版白皮书,启动了项目。2016年初,以太坊的技术得到市场认可,吸引了大量开发者以外的人进入以太坊的世界。
简单来说就是,以太坊是一个你无法关闭的世界计算机。加密架构与图灵完整性的创新型结合可以促进大量的新产业的出现。
Solidity以太坊推出了智能合约,它的编程语言就是 Solidity,它是一种新的编程语言。
为了开发强大的智能合约,以太坊开发了 EVM ,也就是以太坊虚拟机,而以太坊虚拟机上运行的语言就是 Solidity 。Solidity 是一个面向合约开发的高级语言,它的灵感来自 Javascript。它是一门静态类型语言,支持继承,支持各种库和用户自定义的类型。
特点安全性Solidity 直接就被设计为静态类型和强类型的语言,保证对于一些常见错误,让开发者能够迅速通过编译捕捉到,增强的语言的安全性。智能合约往往都跟真金白银挂钩,而且智能合约是部署到区块链上的,而区块链是一个大家形成共识的环境,所以说智能合约部署之后,代码虽然不能说绝对不能改,但是要改也是非常麻烦的事。
从Go语言字符串开始逆袭
源代码runtime/string.go
1234type stringStruct struct { str unsafe.Pointer len int}
2行 可以指向任何数据类型的Pointer,指向底层Byte数组
3行 8个字节的长度 - 是底层Bytes数组的长度,使用unicode字符集,3个自己表示1个汉字,英文在前128位,使用utf-8变长编码(把很长的unicode字符,以8个位为单位的字节),英文字符只需要2个字节,其他需要3个字节
Go语言对utf-8编码/解码 runtime/utf8.go
1234s := "面向加薪学习"fmt.Println(unsafe.Sizeof(s))s = "面向加薪学习-欢喜"fmt.Println(unsafe.Sizeof(s))
输出
1616
1234567891011func ShowLen(s string) { header := (*reflect.StringHeader)(unsa ...
你要高薪,更要深入-逃逸分析
什么是逃逸从栈(Stack)上跑到堆(Heap)上
什么情况下要逃逸变量太大
栈针回收以后,继续使用的变量
逃逸方式指针逃逸函数返回的是对象的指针。
12345678910111213package mainimport "fmt"func escapeHeap01() *int { v := 100 return &v}func main() { p := escapeHeap01() fmt.Println(p)}
上面代码,如果不是返回的指针,只是一个普通的Int,那么,函数会从栈中弹出,返回,但是由于escapeHeap01()调用后,返回一个指针,也就是指向了局部变量的地址,所以会逃逸到Heap上。
空接口逃逸因为空接口作为参数,函数内部会调用反射,要查看实参的类型,反射要求变量要求在heap上,所以要逃逸。
1234func escapeHeap02() { s := "面向加薪学习" fmt.Println(s)}
大变量逃逸大 ...
学会Go语言接口,给自己的逆袭指南
接口与实现1234567891011121314151617181920package mainimport "fmt"type Car interface { Run()}type Tesla struct { Name string}func (t Tesla) Run() { fmt.Println(t.Name + " is Running...")}func main() { var c Car = Tesla{Name: "Tesla"} fmt.Println(c)}
18行 c这个变量是Car类型的值。下面看一下源代码runtime/runtime2.go
123456789101112type iface struct { tab *itab data unsafe.Pointer}type itab struct { ...
看清切片的底牌
源代码runtime/slice.go
12345type slice struct { array unsafe.Pointer len int cap int}
2行 指向底层数组的指针
3行 长度大小
4行 容量大小
字面量创建切片12345678package mainimport "fmt"func main() { s := []string{"碳烤生蚝", "红烧肉", "帝王蟹"} fmt.Println(s)}
go build -gcflags -S main.go
12345678910111213141516 ... 0x0018 00024 (/menu7/main.go:6) MOVD $type.[3]string(SB), R0 0x0020 00032 (/menu7/main.go:6) PCDATA $1, ZR 0x0020 00032 (/ ...