常用数据库
MySQL
分布式关系型数据库
作为一个独立的数据库服务器,应用程序需要与MySQL守护进程通信才能访问数据库
无全文本搜索
PostgreSQL
对象关系型数据库
支持面向对象及关系型数据库功能
并发性能好
SQLite
嵌入式关系型数据库 并不作为一个独立的进程通过某种通信协议与应用程序通信,而是作为应用程序的一部分
自包含、基于文件存储
同一时刻仅允许一个写操作
Elastic
全文搜索引擎
本质上是一个分布式数据库(NoSQL)
Cassandra
分布式数据库,高度可扩展,用于管理大量的结构化数据
高可用性,没有单点故障
列式数据库
...
关于Gin的基本使用方法可移步Gin中文文档
本文以个人实际工程经验为基础,介绍了一种简易但实用的Web服务端构建方式,demo源码见文末。
包含状态的HTTPServer封装要起一个Web服务,首先需要有一个server监听接口并接收http请求。Go在net/http包中有内置的http.server,结构包含了监听端口号Addr、处理方法Handler以及超时设置等属性。有一点不足的是,其没有一个属性或方法能返回当前server的状态。因而需要进行简单封装:
1234567891011type HTTPServer struct { server *http.Serv...
数据结构和大多数语言一样,Golang中的Map同样是利用哈希表作为基础结构来实现的。
12345678910111213141516171819202122232425262728// package runtime hashmap.gotype hmap struct { count int // map长度 flags uint8 //标记 B uint8 // log以2为底哈希桶的对数 (最多能存 6.5 * 2^B 个元素) noverflow uint16 // 溢出桶的个数(近似) hash0 uint32 // 哈...
数据结构作为比较,分别查看array和slice的数据结构:
1234567891011121314151617181920// package types// type.gotype Array struct { len int64 elem Type}// All types implement the Type interface.type Type interface { Underlying() Type String() string}// package runtime// slice.go type slice struct ...
Go因Goroutine而与众不同。在Go程序中所有的用户代码都运行在Goroutine中,为了让程序高效运行需要一个合理的调度机制进行Goroutine的并发调度。 Go语言内置运行时,面向并发需求设计了全新的架构模型——GPM调度模型。
G:Goroutine的简称。 虽然Go进程内的一切都以G的方式运行,但G并非执行体,它仅保存并发任务状态,为任务执行提供栈内存空间;
M:系统线程(OS Thread)的代称,M取自其寓意Machine的首字母。 M是代码的实际执行体。其通过修改寄存器,将执行栈指向G自带栈内存,并在此空间内分配栈堆帧,执行任务函数。 M必须绑定一个有...
GC问题的核心是:抑制堆增长,充分利用CPU资源。Go所采用的GC算法是经典标记-清除算法的进一步改良。本文在介绍Go中GC逻辑之前会先介绍基本的GC算法。
基本GC算法基本的垃圾回收(GC)算法有四种:引用计数法(Reference Counting)、复制法(Copying)、标记-清除法(Mark-Sweep)和标记-压缩法(Mark-Compact)。注:在某些语言环境中会同时使用其中的多种算法进行垃圾回收。
基本流程
检查分配内存总量是否超过预设阈值;
如超过阈值,暂停一切用户逻辑,进行垃圾回收(不释放物理内存);
垃圾回收完成后,恢复用户逻辑,将阈值设为存活对象所用内存的两倍...
内存分配的核心目标
每次申请大内存块,自主管理,减少系统调用
基于块的内存复用,加快内存分配和回收
内存分配的基本策略
每次从系统申请大块内存以减少系统调用;
将申请到的大块内存进行切分构成链表;
为对象分配内存时,只需从大小合适的链表中提取一小块;
回收对象内存时,会将提取的小块内存归还原链表;
如闲置内存过多则尝试归还部分内存给操作系统;
内存块Go的内存分配器将管理的内存块分为两种:
span:由多个连续的页(Page)组成的大块内存;
123//malloc.go PageShift = 13, PageSize = 1<<PageShift, ...
本文以尽量精简的方式介绍了进程、线程、子例程、协程和Go协程的相关概念和关系。
进程(Process)
定义:进程是计算机中正在运行程序的实体(实例):在面向进程设计的系统中,进程是程序的基本执行实体;在面向线程设计的系统中,进程本身不是程序运行的基本单位,更多的是作为线程的容器。
概念:进程是一个实体,拥有独立的地址空间,包括文本区域,数据区域,堆栈等。
程序与进程:程序本身只是指令、数据及其组织形式的描述,进程才是真正运行的示例。一个程序可有若干进程,每个进程都可以以同步或异步的方式独立运行。
进程的并行:多个程序可以进程的形式加载到内存中,并通过时分复用,在同一个处理器上表...
适用于并发查询计算等业务场景。
使用channel12345678910111213141516171819202122232425// channelfunc TestChan() { numbers := []int32{ 1, 2, 3, 4, 5, } ch := make(chan int32, 0) for _, x := range numbers { go func(x int32) { x++ ch <- x }(x) } resNums := []int32{}...
利用godep更新依赖库,最常见的做法是将godep.json中的依赖库版本进行更新,再godep save即可。但这很可能会使得母库和子库的共同依赖不同步进而可能产生报错,这才是本文想解决的问题:Go的包管理工具godep并不像诸如iOS包管理工具CocoaPods那样可以自动统一母库A和子库B的共同依赖(如库C)。当需要对子库B进行更新时,如果单纯的在库A中更新库B,则有可能发生同一个项目A中存在不同版本的依赖库C的情况。为了解决上述问题可进行如下操作:1、在B路径中更新子库B(此时C可能也会跟着更新)
1git pull
2、 在A路径中移除项目A中的Godeps和Vender文件...