go
文章平均质量分 64
alin Wang
sdn studing...
展开
-
交易流程
比特币交易比特币使用的非对称加密算法是ECC(椭圆曲线算法)1. 比特币地址的生成流程私钥生成公钥对公钥做两次哈希,sha256,ripemd160(生成160bit)的哈希值==>公钥哈希将比特币网络的版本号和公钥哈希拼接到一起:21字节bytes对这21字节做两次sha256哈希运算,对结果去前四字节,得到校验码将21字节与4字节的checksum拼接到一起,得到25字节数据做base58编码与base64相同,但是字符集去掉了6个容易混淆的字符0和O原创 2021-01-31 20:35:25 · 625 阅读 · 0 评论 -
命令行的使用cli
命令行的使用cli为程序添加命令行启用的方法新建源程序在其中添加一个结构体// 处理用户输入命令,完成具体函数的调用// cli : command line 命令行type CLI struct { // 不需要字段}// 使用说明,帮助用户正确使用const Usage = `Usage: ./blockchain create "创建区块链" ./blockchain addBlock <需要写入的数据> "添加区块" ./blockchain print原创 2021-01-28 19:09:55 · 862 阅读 · 0 评论 -
区块链持久化
区块链持久化1. bolt数据库1.1 存储结构其中有桶的概念,在一个数据库下有多个桶bucket,很像一个个抽屉key ==> value[]byte ==> []bytekey是唯一的存储顺序是按照key的ASCII值,小在前,大在后1.2 读写方法例如桶1叫:b1写: b1.Put([]byte("key1"), []byte("value1"))读: byte1 := b1.Get([]byte("key1"))读取不存在的key会返回零值1.原创 2021-01-27 22:09:14 · 584 阅读 · 0 评论 -
基本链条的实现
基本链条的实现1. 实现思路定义区块结构第一阶段:先实现基础字段:前区块哈希,哈希,数据第二阶段:补充字段:Version,时间戳,难度值等创建一个区块(提供一个方法)定义区块链结构提供一个创建区块链的方法提供一个向区块链中添加区块的方法打印区块链2. 代码实现Main.gopackage mainimport ( "fmt" "time")// 打印区块链func main() { bc := NewBlockChain() time.Sleep(原创 2021-01-26 10:52:05 · 339 阅读 · 0 评论 -
go语言与mysql
go语言与mysql1. 准备工作首先安装驱动:go get github.com/go-sql-driver/mysqlimport ( "database/sql" _ "github.com/go-sql-driver/mysql")github的必须在使用前导入,它是驱动的依赖包。“database/sql”:是go语言数据库操作函数的包2. 连接数据库func Open(driverName, dataSourceName string) (*DB, error)dri原创 2021-01-18 18:43:41 · 200 阅读 · 0 评论 -
go语言:反射
go语言:反射1. 反射的应用1.1 反射简介go语言通过reflect包提供运行时反射机制静态类型interface{}、Type类型、Value类型1.2 反射应用场景go语言API库封装。 Fmt.Printfgo框架开发。结构体标签的实现。1.3 反射的基本使用在运行时,动态的获取变量信息。值、类型、类别在运行时,获取结构体的信息。字段名、方法在运行时,修改变量指,调用方法。2. 反射的原理变量 – reflect.TypeOf() – refle原创 2021-01-18 11:10:06 · 423 阅读 · 0 评论 -
go语言与JSON
go语言与JSON1. 字节序复习大端法:高存低,低存高小端法:高存高,低存低2. 序列化func Marshal(v interface{}) ([]byte, error)参数:待序列化的数据返回值:json串2.1 结构体序列化要求 结构体类型名 和 成员(属性)名 必须大写(包作用域),才能在json包中可见。(因为json的函数是在其他包中,必须要让其他包可见要转换的结构体)否则,不报错!但不做序列化转换。{“Name”:“张三”,“Age”:29,“Score原创 2021-01-17 16:51:51 · 325 阅读 · 0 评论 -
go语言与爬虫
go语言与爬虫0. 网页爬虫横向爬取:找寻网页的页与页之间的规律。分页器规律纵向爬取:找寻网页之间条目与条目之间的规律。1. 爬取流程明确URL,找寻网页分页器规律获取网页数据 http.Get()使用正则表达式筛选有用信息 MustCompile、FindallstringSubmatch保存信息到本地2. 爬取信息横向规律:https://movie.douban.com/top250?start=25&filter= – 第二页https://movie.原创 2021-01-16 21:49:16 · 252 阅读 · 0 评论 -
go语言与正则表达式
go语言与正则表达式编译解析正则表达式func MustCompile(str string) *Regexp参数:正则表达式字符串。推荐使用反引号`返回值:编译后,go语言能够识别出来的一个正则表达式结构体利用正则从字符串中提取有用信息func (re *Regexp) FindAllStringSubmatch(s string, n int) [][]string参数1:需要过滤的字符串参数2:匹配次数返回值:利用正则表达式匹配成功的子串匹配项中的行、列列0带原创 2021-01-16 19:42:28 · 279 阅读 · 0 评论 -
go语言:http编程
go语言http相关1. 回调函数和C语言一样,在函数参数里加上一个函数指针,传变量的时候将函数指针传进去即可调用type FUNCP func(x int, y bool) intfunc callBack(x int, y bool, p FUNCP) int { fmt.Println("调用回调函数", p(x, y)) return x}func han(x int, y bool) int { fmt.Println("这里是回调函数") return x}func原创 2021-01-16 17:35:52 · 579 阅读 · 0 评论 -
go语言提升(四):tcp/udp,命令行参数
go语言提升(四):tcp/udp,命令行参数1.TCP函数原型及服务器实现Listen函数func Listen(net, laddr string) (Listener, error)参数1:协议类型:tcp、upd(必须小写)参数2:服务器端的IP:port(192.168.31.11:8000)返回值:成功创建的监听器type Listener interface{ Addr() addr Accept() (c Conn, err error) Cl原创 2021-01-14 21:53:20 · 377 阅读 · 0 评论 -
go语言提升(三):select、死锁、互斥锁、读写锁、条件变量、生产者消费者模型
go语言提升(三):select、死锁、互斥锁、读写锁、条件变量、生产者消费者模型1. select1.1 select 概述select是一个关键字。select用于监听数据在channel上的流动select监听channel是异步机制。语法:select { case <- chan1: // 如果chan1成功读到数据,则走该条语句 case <- chan2: // 如果chan2成功读到数据,则走该条语句 defa原创 2020-11-02 16:38:57 · 485 阅读 · 0 评论 -
go语言提高(一):文件读写和目录操作
go语言提高(一):文件读写和目录操作1. 文件的创建和打开1.1 创建文件func Create(name string) (file *File, err error)参数:新创建的文件名,可以是绝对路径也可以是相对路径(相对于.go或.exe文件)返回值文件指针,file结构体指针err,错误返回值创建文件时收到文件掩码的限制,可以使用函数设置文件掩码func Umask(mask int) (oldmask int)参数:指定的文件权限掩码返回值:旧的原创 2020-10-30 18:30:13 · 305 阅读 · 0 评论 -
go语言基础(四):指针、面向对象(继承)、方法
go语言基础(四):指针1. 指针注意:无法获取常量内存地址指针定义的语法:var 指针变量名 *数据类型想要访问指针指向的数据,要使用解引用有关指针的概念性的东西和C语言完全相同func main() { num := 10 var p *int = &num fmt.Printf("%T\n", p) // *int fmt.Printf("%d\n", *p) // 10}2.1 使用new开辟堆空间语法:new(数据类型),返回对应数据类型的指原创 2020-10-27 23:15:13 · 492 阅读 · 0 评论 -
go语言基础(三):map、结构体
go语言基础(三):map、结构体1. map语法:var map的名字 map[键类型]值类型 = make(map[键类型]值类型)map的名字 := make(map[键类型]值类型)如果不写后面的make的话会报错map在定义后不需要给它指定大小就能进行使用,和切片这一点不同要区分对于map直接使用map名[键值]=数据值,就可以进行数据的添加func main() { var m map[int]string = make(map[int]string) m[0] =原创 2020-10-26 15:29:36 · 2167 阅读 · 0 评论 -
go语言基础(二):匿名函数、数组、随机数、切片、字符串
go语言基础(二):匿名函数、数组、随机数、切片、字符串1. 匿名函数匿名函数的使用常用的有两种情况定义并调用匿名函数func main() { // 匿名函数的定义 // func后面的第一个括号代表函数的形参列表 // func后面的第一个括号后可以跟返回值 // 在func后面的反括号后还要再加上一个括号,代表函数的调用,里面要写函数的实参 func() { fmt.Println("hello world") }()原创 2020-10-25 22:54:15 · 979 阅读 · 0 评论 -
go语言基础(一):数据类型、常量、控制语句、循环、函数定义
go语言基础(一):数据类型、常量、控制语句、循环、函数定义1. 变量的定义和使用语法:var 变量名 类型名 = 数值如果当变量仅定义但是不对它进行初始化的话,那么默认是0func main() { var PI float64 = 3.14159 var r float64 = 2.5 var s float64 = PI * r * r var l float64 = PI * r * 2 fmt.Println("s = ", s) fmt.Println("l = ",原创 2020-10-23 22:40:14 · 190 阅读 · 0 评论