0%

Go 语言最大的特色就是其对并发编程的支持。这篇文章重点介绍 Go 语言的并发机制 go routine,以及如何通过 go channel 实现各个 go routine 之间的通信。

阅读全文 »

方法是与对象实例绑定的特殊函数,方法是面对对象编程的基本概念,用于维护和展示对象的自身状态。对象是内敛的,每个实例都有各自不同的独立特征,以属性和方法来暴露对外通信接口,而普通函数则专注于算法流程,通过接收参数来完成特定逻辑运算,并返回最终结果。也就是说,方法是有关联状态的,而函数则没有。

阅读全文 »

函数是结构化编程的最小模块单元,它将复杂算法过程分解为若干较小任务,隐藏相关细节,使得程序结构更加清晰,易于维护。函数被设计成相对独立、通过接收输入参数完成一段算法,输出或存储相关结果。因此函数也是代码复用和测试的基本单元。

阅读全文 »

Linux 程序员通常需要打开多个终端窗口连接到远端服务器,虽然现在的终端程序都比较好用,可以让你在多窗口间自如地切换。但是一旦你的网络断了,所有窗口上的远程连接也就断了,下一秒你不得不重新在各个窗口上进行重连。

通过 Screen,你可以在服务器上建立一个多窗口的会话,即使本地 PC 断网,重连服务器之后,直接恢复该 Screen 会话即可。本篇文章介绍 Screen 的基本用法。

阅读全文 »

每个 C/C++ 程序员可能都经历过定位内存泄露问题的痛苦。一方面,为了减少内存泄露问题,在 C++ 程序中,我们应该尽量使用智能指针,在 C 程序中,我们也可以通过一些内存池技术来管理内存的申请与释放。另一方面,当内存泄露问题真的出现时,通过 gperftools 的 heap checker,我们也可以比较轻松地找到内存泄露的线索,缩短问题定位时间。

阅读全文 »

昨天使用厂内 bthread 库(来源于 brpc,已开源)中的 TimerThread 工具来做定时重试任务,但是在打印返回的 TimerThread ID 时,始终打印的是 0,而 TimerThread 分明已经启动成功了。定位了将近一天,才找到原因,这里分享一下。

阅读全文 »

iproute2 是 Linux 系统上提供的网络管理套件,用于取代之前 Linux 系统上提供的网络管理命令(例如 ifconfig、arp、route 等命令)。其主要包括 ip、tc 以及其他一些命令。虽然为了向后兼容,Linux 系统仍然提供了 ifconfig 等命令,但是这些命令已经不支持新的特性,例如 network namespace 等,甚至很多新 Linux 发行版本已经不再包含这些陈旧的网络管理命令了。这篇文章将学习 iproute2 中 ip 命令的使用。

其实 iproute2 早在 2000 年就已经存在了,但是其文档比较少,导致很多人并不怎么使用这些新的命令。iproute2 能够让你对 Linux 的网络特性有更多的控制手段,同时也能丰富你的调试工具箱。

阅读全文 »

几乎所有的版本控制系统都以某种形式支持分支。使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。在很多版本控制系统中,这是一个略微低效的过程:常常需要完全创建一个源代码目录的副本。对于大项目来说,这样的过程会耗费很多时间。

Git 的分支模型可以认为是它的 必杀技特性。Git 处理分支的方式可谓是难以置信的轻量,创建新分支这一操作几乎能在瞬间完成,并且在不同分支之间的切换操作也是一样便捷。与许多其它版本控制系统不同,Git 鼓励在工作流程中频繁地使用分支与合并,哪怕一天之内进行许多次。理解和精通这一特性,你便会意识到 Git 是如此的强大而又独特,并且从此真正改变你的开发方式。

阅读全文 »

本篇文章涵盖你在使用 Git 完成各种工作时将会用到的各种基础命令。通过这篇文章,将学习配置并初始化一个仓库(respository),开始或停止跟踪(track)文件、暂存(stage)或提交(commit)更改。这篇文章也将演示如何配置 Git 来忽略指定的文件和文件模式、如何迅速而简单地撤销错误操作,如何浏览你的项目的历史版本以及不同提交间的差异、如何向你的远程仓库推送(push)以及如何从你的仓库拉取(pull)文件。

阅读全文 »