如果go代码里使用了cgo,那么编译的时候电脑上必须按照gcc才能正确编译。这篇文章展示了如何用c写一个包让go调用并且不需要使用cgo。实际上,Go1.4之前(包括1.4),runtime 中的很多代码就是这种方式。了解这种方式,对深入学习 runtime 会有好处。 我要晨读

已有970人晨读

在Go语言中,没有字符类型,字符类型是rune类型,rune是int32的别称。Go语言中的字符和字符串,你应该经常使用,但 Unicode、UTF8、rune、int32 等一序列问题,你是否都能知其然呢。本文介绍 Go语言 中的字符和字符串,当做一个引子来好好研究下相关知识。 我要晨读

已有1202人晨读

Go有强烈的C背景,除了语法具有继承性外,其设计者以及其设计目标都与C语言有着千丝万缕的联系。在Go与C语言互操作(Interoperability)方面,Go更是提供了强大的支持。尤其是在Go中使用C,你甚至可以直接在Go源文件中编写C代码,这是其他语言所无法望其项背的。本文介绍Go与C语言的互操作。 我要晨读

已有955人晨读

我们在生产环境下运行的系统要求优雅退出,即程序接收退出通知后,会有机会先执行一段清理代码,将收尾工作做完后再真正退出。我们采用系统Signal来 通知系统退出,即kill pragram-pid。本文介绍Go中的系统Signal处理。 我要晨读

已有917人晨读

Go语言受到诟病最多的一项就是其错误处理机制。如果显式地检查和处理每个error,这恐怕的确会让人望而却步。你可以试试这里列出的几个方法,以避免你走入错误处理方法的误区当中去。本文给出了Go语言的有效错误处理方法。 我要晨读

已有1116人晨读

go语言有一个标准库log,提供了最基本的日志功能,但是没有什么高级的功能,如果需要高级的特性,可以选择glog或log4go。glog是google提供的,类似于google的c++ log库,使用起来非常简单。本文对 glog 使用进行介绍。 我要晨读

已有1065人晨读

#技术晨读# [MySQL FAQ]系列 — 使用mysqldump备份时为什么要加上 -q 参数 mysqldump的时候加上q参数表示的是禁用buffer缓存来存放select结果,因为buffer缓存会使用到swap,然后会导致使用更多的内存和时间。 http://imysql.com/2015/03/21/mysql-faq-why-turn-on-quick-option.shtml 更多历史文章:http://studygolang.com/readings?rtype=1 我要晨读

已有1044人晨读

本篇文章内容来源于Golang核心开发组成员Andrew Gerrand在Google I/O 2014的一次主题分享“Testing Techniques”,即介绍使用Golang开发 时会使用到的测试技术(主要针对单元测试),包括基本技术、高级技术(并发测试、mock/fake、竞争条件测试、并发测试、内/外部测试、vet工具等)等,总结的很全面,这里整理记录下来,希望能给大家带来帮助。 我要晨读

已有1071人晨读

Go 语言的 channel 本身是不支持 timeout 的,所以一般实现 channel 的读写超时都采用 select。在写超时代码时,你可能会写出性能差的甚至错误的代码。文章从遇到的问题,到深入讨论 channel 的 timeout 机制,并做了一些性能上的测试。 我要晨读  相关阅读: 网页链接 

已有1788人晨读

Go Runtime hashmap实现。map 的底层实现就是一个 hash 表,大体结构上和平时在脑海里的 hash 表差不多。hashmap 通过一个 bucket 数组实现,所有元素将被 hash 到数组中的 bucket 中,bucket 填满后,将通过一个 overflow 指针来扩展一个 bucket 出来形成链表,也就是解决冲突问题。本文总结了一些实现细节点。 我要晨读

已有1060人晨读

深入Go语言网络库的基础实现。本文将网络库的底层实现给大体上引导了一遍,知道底层代码大概实现在什么地方,方便结合源码深入理解。Go语言中的高并发、同步阻塞方式编程的关键其实是”goroutine和调度器”,针对网络IO的时候,我们需要知道EAGAIN这个非常关键的调度点,掌握了这个调度点,即使没有调度器,自己也可以在epoll的基础上配合协程等用户态线程实现网络IO操作的调度,达到同步阻塞编程的目的。 我要晨读

已有1134人晨读

位操作是程序设计中对位模式按位或二进制数的一元和二元操作. 一般的,位运算比乘除法运算要快。所以,在一些服务器程序中,经常可以看到位操作的影子。另外,位运算能够实现一些特殊的功能,本文介绍了Go语言通过位运算实现 判断奇偶、求1的个数等。 我要晨读

已有961人晨读

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

已有970人晨读

这几天晨读,推荐了Go语言内存分配器实现方面的文章,不过,之前算是前戏。今天推荐的文章才是真正的理解内存分配器实现。本文将把整个内存分配器的架构以及核心组件给详细的介绍一下,当然亲自对照着翻看一下代码才是王道。 我要晨读

已有1016人晨读

MSpan和FixAlloc一样,都是内存分配器的基础工具组件,但和FixAlloc没太大的交集,各自发挥功效而已。span(MSpan简称span)是用来管理一组组page对象,page就是一个4k大小的内存块而已。span就是将这一个个连续的page给管理起来。本文介绍 Go语言内存分配器-MSpan。 我要晨读

已有828人晨读

昨天晨读分享了Go语言内存分配器设计,了解了内存分配器的大体结构。本文介绍内存分配器中一个工具组件——FixAlloc。FixAlloc称不上是核心组件,只是辅助实现整个内存分配器核心的一个基础工具罢了,由此可以看出FixAlloc还是一个比较重要的组件。让我们一起来了解它。 我要晨读

已有900人晨读

Go语言的整个内存管理子系统主要由两部分组成——内存分配器和垃圾收集器(gc)。整个内存分配器完全是基于Google自家的tcmalloc的设计重新实现了一遍。本文介绍Go语言内存分配器设计。 我要晨读

已有1051人晨读

看了Go runtime中关于select的实现,发现select语句位于for循环之内执行的时候,每一遍循环都需要在底层runtime中经历malloc对象到free对象的过程,我认为这个频繁的内存分配和释放的代价并不小,至少内存不是处于一种稳定的状态。因此,我实际的测试一把使用select来操作channel和不使用select操作channel两种情况下的内存情况。 我要晨读

已有988人晨读

我们如何提供异步版本的API?通常最好的答案是什么也不要做。因为调用者可以使用future特性结合“async”或者任务启动特性,从API外面将一个调用变成异步执行调用。本文从同步API开始介绍了多种异步方式。 我要晨读

已有1296人晨读

随着Golang, Erlang, Scale等为并发设计的程序语言的兴起,新的并发模式逐渐清晰。正如过程式编程和面向对象一样,一个好的编程模式需要有一个极其简洁的内核,还有在此之上丰富的外延,可以解决现实世界中各种各样的问题。本文以GO语言为例,解释其中内核、外延,好文值得多次阅读。 我要晨读

已有991人晨读