Golang
文章平均质量分 81
IQer_AC
这个作者很懒,什么都没留下…
展开
-
unix环境高级编程 第一章 UNIX基础知识 Go实现代码
UNIX则不同, 它只提供一个系统调用, 该系统调用返回国际标准时间1970年1月1日0点以来所经过的秒数.对该值的任何解释, 如将其变换为人们可读的, 使用本地时区的时间和日期, 都留给用户进程进行. 在标准c库中, 提供了若干函数来处理大多数情况. 这些库函数处理各种细节, 例如各种夏令时算法.时钟时间又称为墙上时间(wall clock time). 它是进程运行的时间总量, 其值与系统中同时运行的进程数有关. 在我们报告时钟时间时, 都是在系统中没有其他活动时进行度量的.原创 2023-05-28 15:16:02 · 473 阅读 · 0 评论 -
算法第四版 Algorithms Part 1动态联通性
上图对比普通的quick-union操作和带权重的union操作, 可以看到带权重的操作对树高有所控制.Find查找操作就变成寻找两者是否拥有同样的parent节点, 如果有就是相连的.这样做调整时, 只需要将p的根节点指向q的根节点, 就可以了.不同的点只有当在数组中的项是一样的时候, 那么他们是连通的.依然使用数组, 不过将其看作一组树即一片森林的表示.一种’懒的方法’, 尽量避免计算直到不得不进行计算。校验p和q是否有相同的id。避免将更大的树放在低位。原创 2023-05-27 10:26:50 · 311 阅读 · 0 评论 -
Go by Example: Hello World
有时我们想要构建我们的程序为二进制文件.我们可以使用 go build命令做到这一点.执行程序, 将代码放入hello-world.go文件中并执行 go run命令.我们的第一个程序将打印经典的"hello world"信息.这是完整的源代码.现在我们可以运行和构建基础的Go程序了, 让我们学习更多关于这门语言的内容.我们之后直接执行生成的二进制文件.原创 2023-05-24 23:20:45 · 57 阅读 · 0 评论 -
Go By Example 简介
Go by Examples是一个Go的实践介绍, 会使用有注释的示例程序.Go是一个开源编程语言, 为构建简单, 快速和可靠的软件而设计的.请阅读。看看第一个例子或者浏览一下下面的完整列表.来学习一些Go代码, 工具包和模块.原创 2023-05-24 23:11:34 · 121 阅读 · 0 评论 -
使用go语言构建区块链 Part4.事务1
事务是比特币的核心, 区块链的唯一目的是以安全可靠的方式存储交易, 因此在交易创建后没有人可以修改. 今天我们开始实现事务, 但由于这是一个相当大的主题, 我将它分成两部分: 在这一部分中, 我们将实现事务的通用机制, 在第二部分中, 我们将研究细节.此外, 由于代码的变化是巨大的, 在这里描述它们是没有意义的. 你可以在这里查看到所有的变化.虽然不容易, 但是现在终于实现交易了!地址(address). 我们现在还没有基于私钥(private key)的真实地址.原创 2023-05-24 20:28:43 · 1029 阅读 · 0 评论 -
使用go语言构建区块链 Part3.持久化与命令行接口
到目前为止, 我们已经建立了一个带有工作量证明系统的区块链, 这使得挖矿成为可能. 我们的实现越来越接近于一个功能齐全的区块链了. 但它仍然缺乏一些重要的功能. 今天我们将开始再数据库中存储区块链, 之后我们将实现一个简单的命令行接口来执行区块链的操作. 从本质上讲, 区块链是一个分布式数据库. 我们将忽略’分布式’的部分, 而专注于’数据库’的部分.下次我们将实现: 地址, 钱包和(可能会有)事务.敬请期待!LinksBitcoin Core数据存储boltdbflag。原创 2023-05-24 15:07:59 · 760 阅读 · 1 评论 -
使用go语言构建区块链 Part2.工作量证明
在上一篇文章中, 我们构建了一个非常简单的数据结构, 这是区块链数据库的本质.并且我们可以通过它们之间的链式关系来添加区块: 每个区块都链接到前一个区块.哎, 我们的区块链实现有一个重大缺陷: 向链中添加区块既容易又便捷. 区块链和比特币的关键之一是增加新的区块是一项艰难的任务. 今天我们将修复这个缺陷.原创 2023-05-24 11:25:15 · 735 阅读 · 0 评论 -
使用go语言构建区块链 Part1.基础原型
区块链技术是21世纪最具变革型的技术之一,它仍处于成长阶段, 其潜力尚未完全实现.从本质上说, 区块链是一个分布式的记账数据库.但它的独特之处在于它不是一个私有数据库,而是一个公共数据库, 也就是说, 每个使用它的人都有它的完整或部分副本.而且,只有在征得其他数据库维护者的同意的情况下, 才能添加新记录.此外, 正是区块链使加密货币和智能合约成为可能.在本系列文章中, 我们将构建一个基于简单区块链实现的简易的数字加密货币.原创 2023-05-24 09:29:35 · 1742 阅读 · 0 评论 -
从零实现一个数据库(DataBase) Go语言实现版 7.空闲列表: 重用页
由于我们的B树时不可变的, 每次对kv存储的更新都会在路径上创建新节点, 而不是更新当前节点, 从而使一些节点无法从最新版本访问到.我们需要从旧版本中重用这些不可访问的节点, 否则, 数据库文件将无限增长.原创 2023-05-23 19:08:36 · 603 阅读 · 0 评论 -
从零实现一个数据库(DataBase) Go语言实现版 6.持久化到磁盘
下面是更新master page的功能. 与用于读取的代码不同, 它不使用映射地址进行写入.这是因为通过mmap修改页不是原子性的. 内核可能会在中途刷新页并损坏磁盘文件, 而不跨越页边界的小的write操作则保证是原子性的.随着文件的增长, 我们可能需要扩展映射的范围. 扩展mmap范围的系统调用是mremap.不幸的是, 当通过重新映射扩展范围时. 我们可能无法保留起始地址. 我们扩展映射的方法是使用多个映射–为溢出文件范围创建一个新的映射.新映射的大小呈指数增长, 因此我们不必频繁调用mmap.原创 2023-05-23 17:47:27 · 900 阅读 · 0 评论 -
从零实现一个数据库(DataBase) Go语言实现版 5.B树实现(Part2))
紧接着上一篇进行b树的实现.原创 2023-05-23 15:20:08 · 816 阅读 · 0 评论 -
从零实现一个数据库(DataBase) Go语言实现版 4.B树实现(Part1))
本章将使用Go语言实现一个不可变地B+树.这是一个最小实现, 因此很容易理解.原创 2023-05-23 14:01:51 · 1283 阅读 · 1 评论 -
从零实现一个数据库(DataBase) Go语言实现版 3.B树: 思路
让我们从一个排好序的数组开始, 查询可以通过二分法来完成.但更新数组是O(n)的时间复杂度是我们需要解决的问题.更新一个大数组是很糟糕的, 所以我们把它分成更小的数组.假设我们将数组分成sqrt(n)个部分, 每个部分平均包含sqrt(n)个键.从叶子节点开始键插入.叶节点就是键的排序列表.将键插入到叶子中是微不足道的.但是, 插入可能导致节点大小超过页面大小.在这种情况下, 我们需要将叶子节点拆分为2个节点, 每个节点包含一半的键, 以便两个叶子节点都适应一个页大小.这是对b树的另一种直观理解.原创 2023-05-22 21:10:00 · 362 阅读 · 0 评论 -
从零实现一个数据库(DataBase) Go语言实现版 2.索引
然而, 在专门的应用中可能会使用哈希表/散列表.使用哈希表的另一个头痛的问题是大小调整操作.初始调整大小复杂度在O(n), 会导致磁盘空间和IO的突然增加.是有可能做到增量地调整哈希表的, 但这会增加复杂度.数据库索引大多数关于范围查询和点查询, 而且很容易看出范围查询只是点查询的一个超集.如果我们提取数据库索引的功能, 那么创建键值存储就很简单了.但关键是数据库系统可以建立在KV存储之上.哈希表/散列表在设计一个通用的kv存储时是首先被排除在外的.主要原因是排序-许多现实世界的应用需要分类和排序.原创 2023-05-22 20:18:33 · 512 阅读 · 0 评论 -
从零实现一个数据库(DataBase) Go语言实现版 1.文件与数据库
本章将展示简单地将数据存入文件地局限以及数据库解决地问题。原创 2023-05-22 16:00:12 · 423 阅读 · 0 评论 -
从零实现一个数据库(DataBase) Go语言实现版 0.介绍
如果我们忽视持久化的层面并且假设数据集很适合存在内存中, 快速地找到数据就是一个数据结构地问题. 持久化存在磁盘上的,用于查找数据的数据结构在数据库系统中就称为索引(indexes).而且数据库索引的大小可以超过内存的大小.这也就是说,如果你的问题适合使用内存解决, 那就是个比较容易的问题.这就是我们需要索引(indexes)的原因.任何结果都有可能.当你仅仅是简单写入文件的话, 你的数据并不能保证会持久化到磁盘上. 这对数据库是至关重要的.而且数据库在一次意外宕机后将会恢复到可用的状态.原创 2023-05-22 14:21:45 · 828 阅读 · 0 评论