Go语言中采用的是隐式接口, 只要满足的接口的定义, 就可以当作接口使用。隐式接口的好处有很多,但是隐式接口会带来冲突问题。本文介绍如何解决Go语言中隐式接口的冲突问题。 我要晨读

已有1617人晨读

函数的调用信息是程序中比较重要运行期信息,在很多场合都会用到(比如调试或日志)。Go语言 runtime 包的 runtime.Caller / runtime.Callers / runtime.FuncForPC 等几个函数提供了获取函数调用者信息的方法。本文主要讲述这几个函数的用法。 我要晨读

已有1469人晨读

本文是一篇并发编程方面的入门文章,较全面的总结,以Go语言编写示例代码,内容涵盖:运行期并发线程(goroutines)、基本的同步技术(管道和锁)、Go语言中基本的并发模式、死锁和数据竞争、并行计算。 我要晨读

已有1527人晨读

我们从大量的 go 用户中收集了有关于使用 defer 和 panic 的性能统计。不像其它的 APM/error 记录公司,我们的重点不是告诉你有一个问题,而是实际解决问题的方法。这就是为什么我们要使用 go。本文介绍 Go 语言的手工内存管理。 我要晨读

已有1616人晨读

Go如何处理zip中的中文文件名?Go的标准库已经自带了zip的库,不过zip包在处理内部文件名时,默认是utf8编码的。对于Windows中文用户,生成和读取zip内部文件名默认是GBK编码的。因此,在处理涉及GBK的文件名时需要做一个转换。 我要晨读

已有1737人晨读

Go和C如何共享内存资源:Go语言作为一个现代化的编程语言以及支持垃圾内存的自动回收特性(GC)。我们现在关注的是C语言返回的内存资源的自动回收技术。 我要晨读

已有1611人晨读

Go语言作为一个现代化的编程语言以及支持垃圾内存的自动回收特性(GC)。我们现在关注的是非内存资源的自动回收技术。本文主要基于Go语言的defer和runtime.SetFinalizer两个基础特性, 来解决资源的自动回收问题。 我要晨读

已有1643人晨读

类型转换和类型断言是Go语言中比较绕的地方,Go语言要求所有统一表达式的不同的类型之间必须做显示的类型转换。而作为Go语言鼻祖的C语言是可以直接做隐式的类型转换的。当然作为const类的字面值常量是要灵活很多的。 我要晨读

已有1551人晨读

做过 Web 开发的,应该都用过或听过 jQuery,它提供了方便的操作 DOM 的 API。使用 Go 语言做服务器端开发,有时候需要解析 HTML 文件,比如抓取网站内容、写一个爬虫等。这时候如果有一个类似 jQuery 的库可以使用,操作 DOM 会很方便,而且,上手也会很快。本文介绍 github.com/PuerkitoBio/goquery 库的使用 我要晨读

已有1860人晨读

虽然写出7x24小时不间断运行的服务是一件很酷的事情,但是我们仍然在某些时候,譬如服务升级,配置更新等,得考虑如何优雅的结束这个服务。本文更接地气的介绍Go中优雅的HTTP服务关闭。 我要晨读

已有1788人晨读

ngrok是强大的tunnel(隧道)工具,可以很便捷的协助进行服务端程序调试,尤其在进行一些Web server开发中。ngrok本身是用go语言实现的,需要go 1.1以上版本编译。本文以ngrok 1.7版本源码作为原理分析的基础。 我要晨读

已有1632人晨读

连接Mysql数据库,提供api给其他程序调用来实现增删改产,使用的驱动是go-sql-driver/mysql。但是在有一定量的查询结果以后,会出现too many connection的错误。本文介绍该问题的解决方案。 我要晨读

已有1685人晨读

使用Defer的几个场景:Go 语言中的 defer 语句是 UNIX 之父 Ken Thompson 大神发明的, 是完全正交的设计。也正因为 Go 语言遵循的是正交的设计, 所以才有了: “少是指数级的多/Less is exponentially more” 的说法. 因为是正交的设计, 最终得到的组合形式是指数级的组合形式。 我要晨读

已有1176人晨读

go语言的一个重大特色就是支持协程(coroutine)。为了更好的了解goroutine,有必要谈谈goroutine调度模型的实现。在看了一些goroutine scheduler资料后,本文从另一个角度切入,描述下一个简单的协程调度模型如何实现。 我要晨读

已有1772人晨读

Go语言默认的 sync.RWMutex 实现在多核环境中表现并不佳,因为所有的读者在进行原子增量操作时,会抢占相同的内存地址。该文探讨了一种 n-way RWMutex,也可以称为“大读者(big reader)”锁,它可以为每个 CPU 内核分配独立的 RWMutex。 我要晨读

已有1512人晨读

退出运行中的程序,可以粗暴的kill -9 $PID,但这样会破坏业务的完整性,有可能一个正在在执行的逻辑半途而费,从而产生不正常的垃圾数据。本文总结在go语言中,如何能优雅的退出网络应用,涉及的知识包括:signal,channel,WaitGroup等。 我要晨读

已有1589人晨读

对于这样一长串信息:gc5(6): 11+12+357+77 us, 0 -> 1 MB, 4294 (5261-967) objects, 67/2/0 sweeps, 6(115) handoff, 6(9) steal, 170/56/5 yields,你明白它们的含义吗?目前 GC 还是 Go 的一个需要不断改进的点。本文介绍 Golang的GC信息。 我要晨读

已有2499人晨读

Golang使用包(package)这种语法元素来组织源码,所有语法可见性均定义在package这个级别,与Java 、python等语言相比,这算不上什么创新,但与C传统的include相比,则是显得“先进”了许多。Golang中包的定义和使用看起来十分简单,然而里面却有很多知识点。本文理解Golang包导入。 我要晨读

已有1469人晨读

默认情况下,向一个hash表插入的元素是没有固定顺序的。但是因为很多原因,比如有一些帖子就指出了不是所有的map都是hash表(而且有些语言还有有顺序的hash表,比如java的TreeMap),我还是能够了解为什么很多人会假定遍历map元素的顺序和向map插入元素的顺序是相同的。作者认为这是Go设计的一个绝妙之处。 我要晨读

已有1798人晨读

socket 编程,可能会碰到 粘包 问题。我们和客户端约定数据交互格式是一个json格式的字符串,当客户端发送数据给服务端的时候,如果服务端没有及时接收,客户端又发送了一条数据上来,接收缓冲区满了的话,那么也有可能接收到半截的json字符串。本文介绍golang中tcp socket粘包问题和处理。 我要晨读

已有1278人晨读