regex – 如何在Go中执行不区分大小写的正则表达式?

可以将不区分大小写的标志设置为正则表达式中的第一项。

你这样做通过添加 (?i)到正则表达式的开头。

对于一个固定的正则表达式它看起来像这样。

有关标志的更多信息,请搜索syntax documentation中的术语“flags”。

Continue reading "regex – 如何在Go中执行不区分大小写的正则表达式?"

Go继承的属性修改示例

执行后,输出结果为:

 

Go多重继承示例

 

ProtoBuf安装及使用

ProtoBuf: 是一套完整的 IDL(接口描述语言),出自Google,基于 C 进行的实现,开发人员可以根据 ProtoBuf 的语言规范生成多种编程语言(Golang、Python、Java 等)的接口代码,本篇只讲述 Golang 的基础操作。据说 ProtoBuf 所生成的二进制文件在存储效率上比 XML 高 3~10 倍,并且处理性能高 1~2 个数量级,这也是选择 ProtoBuf 作为序列化方案的一个重要因素之一。 Continue reading "ProtoBuf安装及使用"

安装gRPC运行环境

安装官方安装命令:

是安装不起的,会报:

原因是这个代码已经转移到github上面了,但是代码里面的包依赖还是没有修改,还是 google.golang.org 这种地址,

所以不能使用go get的方式安装,正确的安装方式:

Continue reading "安装gRPC运行环境"

Goroutine调度器(二):调度流程简述

我们都知道Go语言是原生支持语言级并发的,这个并发的最小逻辑单元就是goroutine。goroutine就类似于Go语言提供的一种“用户态线程”,当然这种“用户态线程”是跑在内核级线程之上的。当我们创建了很多的goroutine,并且它们都是跑在同一个内核线程之上的时候,就需要一个调度器来维护这些goroutine,确保所有的goroutine都使用CPU,并且是尽可能公平的使用CPU资源。

这个调度器的原理以及实现值得我们去深入研究一下。支撑整个调度器的主要有4个重要结构,分别是P、M、G、Sched,前三个定义在runtime.h中,Sched定义在proc.c中。

  • Sched结构就是调度器,它维护有存储M和G的队列以及调度器的一些状态信息等。
  • M代表内核级线程,一个M就是一个线程,goroutine就是跑在M之上的;M是一个很大的结构,里面维护小对象内存cache(mcache)、当前执行的goroutine、随机数发生器等等非常多的信息。
  • P全称是Processor,处理器,它的主要用途就是用来执行goroutine的,所以它也维护了一个goroutine队列,里面存储了所有需要它来执行的goroutine,这个P的角色可能有一点让人迷惑,一开始容易和M冲突,后面重点聊一下它们的关系。
  • G就是goroutine实现的核心结构了,G维护了goroutine需要的栈、程序计数器以及它所在的M等信息。

理解M、P、G三者的关系对理解整个调度器非常重要,我从网络上找了一个图来说明其三者关系:

地鼠用小车运着一堆待加工的砖。M就可以看作图中的地鼠,P就是小车,G就是小车里装的砖。一图胜千言啊,弄清楚了它们三者的关系,下面我们就开始重点聊地鼠是如何在搬运砖块的。 Continue reading "Goroutine调度器(二):调度流程简述"

Goroutine调度器(一):P、M、G关系

在了解Go的运行时的scheduler之前,需要先了解为什么需要它,因为我们可能会想,OS内核不是已经有一个线程scheduler了嘛?
熟悉POSIX API的人都知道,POSIX的方案在很大程度上是对Unix process进场模型的一个逻辑描述和扩展,两者有很多相似的地方。 Thread有自己的信号掩码,CPU affinity等。但是很多特征对于Go程序来说都是累赘。 尤其是context上下文切换的耗时。另一个原因是Go的垃圾回收需要所有的goroutine停止,使得内存在一个一致的状态。垃圾回收的时间点是不确定的,如果依靠OS自身的scheduler来调度,那么会有大量的线程需要停止工作。 Continue reading "Goroutine调度器(一):P、M、G关系"

gf框架之并发安全容器 - gmap,以及与sync.Map的性能比较

gf框架提供了几个非常实用的并发安全容器,其中gmap就是项目开发中最常用的一个。

gmap具体的方法请参考godoc:https://godoc.org/github.com/johng-cn/gf/g/container/gmap

gmap内部有多个类型结构体定义,包括:IntBoolMapIntIntMapIntInterfaceMapIntStringMapInterfaceInterfaceMapStringBoolMapStringIntMapStringInterfaceMapStringStringMapUintInterfaceMap

从执行效率上考虑,基于不同的需求场景,选择合适的类型结构体,其执行效率是不一样的,以下使用基准测试来对比各个类型的写入性能(测试代码):

Continue reading "gf框架之并发安全容器 - gmap,以及与sync.Map的性能比较"

gkvdb v2.0发布,性能改进及高可用版本

项目地址:https://gitee.com/johng/gkvdb

距离在开源中国发布的gkvdb v1.81已经过去了近3个月,在这三个月中gkvdb也变得越来越成熟稳定,本次发布最大的两点在于gkvdb的性能改进以及高可用特性。

其中,性能改进主要是针对于gf框架改进的一些对应的协调改进工作,以及将同步机制从定时同步调整为使用golang的channel实现的实时同步,提高了同步的效率。

高可用特性保证了在任何的情况下,只要API调用成功,那么这条数据即是成功,处理结果在任何异常情况下也不会发生改变,该特性使得gkvdb可以被推广使用到更复杂的生产环境中,保证写入数据的稳定可靠。特别是,gkvdb经过了严格的并发安全测试,在高并发的环境下也表现得非常出色。

自己的博客,本次发布信息也就这些吧。