Development

一个小问题: Golang可执行程序的退出码

本周因为工作上的遍历需要, 用Go语言写了一个用于批量文本解析的命令行工具。由于这个工具是要嵌入shell脚本中运行的,所以在写该工具的异常处理时突然意识到一个问题: Go语言可执行程序的异常退出码该怎么设置?

于是带着这个非常细节的问题,稍稍调查了一下,结果发现还是有不少东西可说道说道的…

记一次面向线程栈的防爆栈机制的实现探索

爆栈(stack overflow), 众所周知是一种软件的致命错误, 一旦发生程序就core了。根据维基百科的描述,当代码中有以下三种情形时会引发爆栈

  1. 无限递归
  2. 函数调用链展开过深
  3. 函数内申请过大的局部变量

其中1.和2.本质上是相同的,不管是否递归,只要函数调用链过深,压栈过多就会引发爆栈。只不过在实践中,由递归更容易引发爆栈。

可是在很多时候,我们无法避免递归。比如数据库在对SQL语句的执行实现中,伴随着输入的SQL语句的复杂性,间接递归通常是可以预见的。但是无论哪种情况,我们都不能容忍一个用户输入导致程序爆栈,因此这种情况下,我们就需要一个防爆栈机制

下文通过介绍我经手的一个防爆栈机制的实现过程,分享一下有关程序设计的教训与心得:

如何为PostgreSQL创建一个内置函数?

这篇文章我已经酝酿颇久了,诱因是因为PingCAP团队为了推广他们的TiDB而在知乎专栏发了一篇文章《TiDB 增加 MySQL 内建函数》。受此文启发,我在网上搜索了一下PostgreSQL(以下略称”PG”)中定制内置函数(Built-in Function)相关的文章,果然没有搜到什么像样的中文文章。其实为PG添加内置函数并不难,可能是相对于hacking它的SQL引擎或者存储引擎等等话题而言,加一个内置函数的逼格实在是太Low吧。不过TiDB这个诞生还没多久的数据库产品都知道通过先利用内置函数这个话题来由简入深地吸引广大开发者为它贡献代码,PG作为一个诞生了已有20年的开源数据库老大哥却没有一篇像样文章,也难怪PG的普及率不高了。

以上就作为这篇分享的「意味づけ」吧…

主线程等待子线程结束的各语言实现

在涉及到并发编程的情况下,经常性地会碰到一种场景:

由一个线程开启了多个线程并发执行多个任务,之后由该线程(so called “主线程”)等待多个线程都结束后汇总结果.

这种场景下,主线程在其创建的子线程执行期间内需要阻塞,直到其他子线程都执行完毕。由于这类场景已经在不同语言的开发中遇到多次,所以汇总一下这些语言的常用实现方法,以后查起来也方便~

C语言程序通过函数指针调用Go函数的方法

在github上关于cgo的wiki中,有一章节专门介绍了如何利用cgo技术通过函数指针调用Golang的函数实现. 不过,仔细观察这个章节的代码示例可以发现,它所要解决的其实是以下的场景:

在Golang中想要调用一个已有的C语言函数,但是该C语言函数要求一个函数指针作为参数时应该怎么办?

如果将这个场景稍微改变一下,改成以下场景,对应的解法又该是什么?

在一个C语言实现的已有系统中,对于一个要求函数指针的函数,如何传入一个Golang实现的回调函数以实现“用Golang扩展C语言系统”的目的。

我基于wiki中已有的代码简单探索了一下方法,结果分享如下:

一见如故的Go语言

从去年接触Go语言(以后简称”Golang”)到现在,已经有1年的时间了。感觉随着使用经验的积累,越发地喜爱这么编程语言。作为一个以C, C#语言出道,并自学了Java, Python, Golang的无证程序员,使用 了一段时间Go语言后,最明显的感觉就是:“这正式我所期盼的语言”。特别是写多了C语言代码,虽然感叹于C语言在语言上的简洁与性能上的高效,但是对于现实中C语言在开发方面的低效也总是吐槽不断。遭遇了Go语言之后,认为这门语言是C语言的最好传人(不要提C++)。

Gopher

以下分享一些我认为Golang做的比较值得推崇的地方: