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