随笔分类 -  Go

摘要:frp frp为golang开发的高性能内网穿透、反向代理软件,支持tcp、udp、http、https协议等,使用frp进行穿透需要有外网服务器; frp分为服务端frps与客户端frpc,服务端监听frp端口,客户端通过frp端口连接到服务端同时通知服务端开启代理的服务类型与端口,服务端监听客户 阅读全文
posted @ 2022-10-29 12:35 AiFly 阅读(297) 评论(0) 推荐(0)
摘要:REPL为Read-Eval-Print Loop的简写,为一种简易的,可交互式的编程环境,使用者可以方便的调试相关代码: Read: 读取用户输入; Eval: 计算输入的数据; Print: 输出所计算的数据; Loop: 循环执行上述流程; 目前多种编程语言也都官方自带了REPL工具,如nod 阅读全文
posted @ 2022-06-28 18:50 AiFly 阅读(242) 评论(0) 推荐(0)
摘要:IO多路复用使得一个线程就可就可以处理多个网络连接,无需要创建多个线程来处理多个socket连接,减少不必要的资源开销,但是Select还是Poll、Epoll模式都有着不同的区别; 上篇在介绍Select模式是也介绍了Select模式存在的种种问题,如大量FD集从用户态拷贝到内核态、FD集合的遍历 阅读全文
posted @ 2022-04-17 20:38 AiFly 阅读(1391) 评论(0) 推荐(0)
摘要:IO多路复用通过某种机制使进程监听某些文件描述符,当文件描述符中有读或写就绪时,进程能够收到系统内核发送的相应通知从而进行相应的IO操作;IO多路复用有:select、poll、epoll等模式,这里主要介绍select;select本质上也是同步IO,调用时阻塞自己,IO事件就绪后被唤醒返回负责读 阅读全文
posted @ 2022-03-26 20:44 AiFly 阅读(469) 评论(0) 推荐(0)
摘要:上篇文章简单的填了一个坑基于LSM数据库的实现了WAL,在该版本中如数据写入到内存表的同时将未持久化的数据写入到WAL文件,在未将数据持久化时程序崩溃,可通过WAL文件将数据还原恢复从而避免了数据的丢失。 目前此基于LSM的数据库还有三大坑: 1、索引问题 2、SSTable合并问题 3、单机版本问 阅读全文
posted @ 2022-02-27 21:55 AiFly 阅读(343) 评论(0) 推荐(0)
摘要:上篇文章简单的实现了基于LSM数据库的初步版本,在该版本中如数据写入到内存表后但还未持久化到SSTable排序字符串表,此时正好程序崩溃,内存表中暂未持久化的数据将会丢失。 引入WAL 为了解决上述问题,将引入数据库中常用于解决类似问题的方法:WAL(Write Ahead Log)预写式日志——在 阅读全文
posted @ 2022-01-27 11:40 AiFly 阅读(414) 评论(0) 推荐(0)
摘要:前篇文章对LSM的基本原理,算法流程做了简单的介绍,这篇文章将实现一个简单的基于LSM算法的迷你Key-Value数据库,结合上篇文章的理论与本篇文章的实践使之对LSM算法有更好的理解,当然此版本还有很大问题只是Demo模型,后面也会指出; 此LSMDB有支持常见的数据库四大功能:CURD(增删查改 阅读全文
posted @ 2021-12-20 10:53 AiFly 阅读(289) 评论(0) 推荐(0)
摘要:LSM Tree(log-structured merge-tree)是一种文件组织结构的数据结构,目前在不少数据库中都有使用到,如SQLite、LevelDB、HBase在Mongodb中也有一个LSM引擎; 在传统的关系型数据库中使用的是B-/B+ tree作为索引的数据结构,B tree的查询 阅读全文
posted @ 2021-11-26 11:39 AiFly 阅读(2697) 评论(0) 推荐(0)
摘要:在上篇文章中我们跟踪ls命令看到了其所使用的这么几个系统调用:stat、openat、fstat、getdents、close、write等,这里再简单介绍下这几个系统调用的功能: **stat:**为获取文件状态系统调用 **openat:**将打开目录/data获取它的文件描述符,返回值3即为文 阅读全文
posted @ 2021-09-21 13:08 AiFly 阅读(730) 评论(0) 推荐(0)
摘要:通过strace工具可跟踪用户进程与Linux内核的调用交互,可看到其中的System Call(系统调用)情况; 安装strace: apt-get instsall strace strace安装完成后执行:strace ls /data即可看到ls命令执行时所执行的系统调用情况,如下图所示: 阅读全文
posted @ 2021-09-05 22:07 AiFly 阅读(366) 评论(0) 推荐(0)
摘要:默认情况下程序输出到终端的字符样式为白字黑背景,样式、字体比较单一。如想改变程序输出到终端字符的样式等可使用ANSI转移码使其输出具有不同样式; ANSI转义序 ANSI转义序列包括这三个部分组成:前置引导,CSI转义序列,结束符号 1、前置引导: 为ESC的ASCII值(\033,\0x1b),标 阅读全文
posted @ 2021-08-14 15:40 AiFly 阅读(411) 评论(0) 推荐(0)
摘要:最近在Linux下开发Go程序,发现一个奇怪的问题,在读取Linux系统信息时读到了空字符,导致了程序异常。在ASSIC中十六进制0为字符NUT,表示为空字符NULL。但这个字符在不同的编程语言、不同的运行环境中却有着不一样的呈现,如果换一个角度看,空字符也就是无字符也就能解释ASSIC空字符没有显 阅读全文
posted @ 2021-07-10 10:09 AiFly 阅读(1709) 评论(0) 推荐(0)
摘要:与其他编程语言一样在并发环境下如不对多个goroutine(线程)访问或修改的共享资源元素的进行控制,让进入临界区的对象互斥。就可能会出现数据异常情况; 一个非线程安全对象如下,如不对Id的访问进行控制,多个goroutine进行更新Id字段是就会出现数据不一致的情况,如下示例: type Conf 阅读全文
posted @ 2021-06-19 10:02 AiFly 阅读(772) 评论(0) 推荐(0)
摘要:插件化开发提供了很多便利,可动态扩展程序的相关功能,如Windows中的DLL、Linux中的So文件、还有IDEA中的插件,应用范围不可谓不广; 在Golang中提供了自己的插件机制,可使用其进行插件化开发;在Golang的plugin包中提供了加载插件、调用插件中函数的相关方法; Golang中 阅读全文
posted @ 2021-03-20 15:02 AiFly 阅读(2166) 评论(0) 推荐(0)
摘要:在接入第三方数据流或接入物联网设备时,通常这些数据所上报的数据只是按照指定的协议所编码,上报的数据流也不够紧凑,如我们直接存储这类字节流数据也比较大。此时可以将字节流转为其他压缩格式的流,如Protobuf等; 将字节流转为Protobuf流具体流程为:定义Proto文件、生成对应的Proto对象、 阅读全文
posted @ 2021-01-01 17:42 AiFly 阅读(1451) 评论(0) 推荐(0)
摘要:SingleFlight将并发请求合并成一个请求,可用于减少下游压力;CyclicBarrier可重用栅栏并发原语,控制一组请求同时执行; SingleFlight 在Go中SingleFlight并不是原生提供的,而是开发组提供的扩展并发原语。它可实现多个goroutine调用通过一函数时,只让一 阅读全文
posted @ 2020-12-14 16:25 AiFly 阅读(1099) 评论(0) 推荐(0)
摘要:Go中也提供了反射机制,与Java一样Go的反射也是在运行时获取对象的相关信息,更新对象内部状态;Golang通过反射可以获取对象类型、字段类型与值、调用struct实例方法、更新实例值等; Go关于反射相关的对象、函数都在reflect包中最主要的两个为:Type与Value; Go提供了下面两个 阅读全文
posted @ 2020-05-19 22:43 AiFly 阅读(2481) 评论(0) 推荐(0)
摘要:Go中存在着不少内置函数,此类函数并不需要引入相关Package就可以直接使用该类函数。在Go的源码builtin包的builtin.go中定义Go所有的内置函数;但该文件仅仅是定义描述出了所有内置函数,并不包含函数的任何实现代码,该文件除了定义了内置函数还定义了部分内置类型; 内置函数使用 len 阅读全文
posted @ 2020-03-23 21:55 AiFly 阅读(3469) 评论(0) 推荐(1)
摘要:Golang中内置了对单元测试的支持,不需要像Java一样引入第三方Jar才能进行测试,下面将分别介绍Golang所支持的几种测试; 一、测试类型 Golang中单元测试有功能测试、基准测试、示例测试或称示例函数三种; 功能测试必须以TestXXX函数名出现,基准测试必须以BenchmarkXXX函 阅读全文
posted @ 2020-02-25 23:14 AiFly 阅读(582) 评论(0) 推荐(1)
摘要:一、类型方法的实例成员复制与类型方法的实例成员引用   在Go中可以类似Java等面向对象语言一定为某个对象定义方法,但是Go中并没有类的存在,可以不严格的将Go中的struct类型理解为面向对象中的类; type demoObject struct { id int } &em 阅读全文
posted @ 2019-12-22 16:06 AiFly 阅读(1036) 评论(0) 推荐(0)