202002-18 Go语言之并发 HOT Go语言的并发同步逻辑来自一个叫做通信顺讯进程(CSP)的范型。CSP是一种消息传递模型,通过在goroutine之间传递数据来传递消息,而不是通过对数据进行加锁来实现同步访问。这种数据的类型叫做通道(channel) 。 继续阅读 >
202002-17 从Go汇编角度解释for循环的两个疑点 Go常用的遍历方式有两种:for和for-range。实际上,for-range也只是for的语法糖,本文试图从汇编代码入手解释for循环是如何工作的。 继续阅读 >
202002-17 Go实现工作池的两种方式 HOT worker pool其实就是线程池thread pool。对于go来说,直接使用的是goroutine而非线程,不过这里仍然以线程来解释线程池。 在线程池模型中,有2个队列一个池子:任务队列、已完成任务队列和线程池。其中已完成任务队列可能存在也可能不存在,依据实际需求而定。 继续阅读 >
202002-17 互斥锁Mutex和读写锁RWMutex用法详述 HOT Mutex和RWMutex都不关联goroutine,但RWMutex显然更适用于读多写少的场景。仅针对读的性能来说,RWMutex要高于Mutex,因为rwmutex的多个读可以并存。 继续阅读 >
202002-16 defer、panic和recover HOT defer关键字可以让函数或语句延迟到函数语句块的最结尾时,即即将退出函数时执行,即便函数中途报错结束、即便已经panic()、即便函数已经return了,也都会执行defer所推迟的对象。 继续阅读 >
202002-16 import导包和初始化阶段 HOT 编译器会根据上面指定的相对路径去搜索包然后导入,这个相对路径是从GOROOT或GOPATH(workspace)下的src下开始搜索的。 继续阅读 >
202002-15 为什么Go语言把类型声明放在后面 小编就为大家分享一篇关于为什么Go语言把类型声明放在后面?,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧 关于类型,官网上有一段仔细地介绍了一下函数指针的部分,现在的设计比起 C 的语法,清晰很多。 继续阅读 >
202002-14 Go基础系列:构建go程序 HOT 1.由于可以将所有go项目放在同一个$GOPATH目录下,为了区分src下的项目目录和库文件目录,建议将每个项目目录设置深一点。 2.go install时,先进入到项目目录下。 3.库文件的名称(也是目录名)要选取合理,尽量短,但却尽量见名知意,也尽量减少名称重复的几率。 例如util这种名称到处都是,可以修改为numutil、nameutil等。 继续阅读 >
202002-13 go 语言映射(map)要点总结 HOT Go语言中映射是一种字典类型的数据结构,类似于 c++ 和 java 中的 hashmap,用于存储一系列无序的键值对。 • 映射是基于键来存储值。映射的优势是能够基于键快速索引数据。键就像索引一样,指向与该键关联的值,在内存中键值对的关系如下图所示。 继续阅读 >
202002-13 Go 每日一库之 godotenv twelve-factor应用提倡将配置存储在环境变量中。任何从开发环境切换到生产环境时需要修改的东西都从代码抽取到环境变量里。 但是在实际开发中,如果同一台机器运行多个项目,设置环境变量容易冲突,不实用。godotenv库从.env文件中读取配置, 然后存储到程序的环境变量中。在代码中可以使用读取非常方便。godotenv源于一个 Ruby 的开源项目dotenv。 继续阅读 >
202002-12 图解Go语言内存分配 Go语言内置运行时(就是runtime),抛弃了传统的内存分配方式,改为自主管理。这样可以自主地实现更好的内存使用模式,比如内存池、预分配等等。这样,不会每次内存分配都需要进行系统调用。 继续阅读 >
202002-12 图解Go语言的context了解编程语言核心实现源码 HOT 于线程并发的编程语言中常用的一个概念,当一个线程派生出一个子线程后通常会加入父线程的线程组(未指定线程组的情况下)中, 最后可以通过ThreadGroup来控制一组线程的退出等操作, 然后在go语言中goroutine没有明确的这种parent/children的关系,如果想退出当前调用链上的所有goroutine则需要用到context 继续阅读 >
202002-11 Dropbox的GO语言之旅:可靠性和持久性 HOT Go语言非常高效,支持扩展,而且还能提高生产。一些程序员觉得使用Go进行工作很有趣;另一些人则认为它缺乏想象力,甚至枯燥乏味。本文我们将解释为什么这些对立的观点是不成立的。Go语言旨在解决谷歌在软件开发中所面临的问题,导致了这门语言并不是一门突破性的研究语言,但对于大型软件项目来说,它还是一个很优秀的工具。”——Rob Pike,2012年 继续阅读 >
202002-11 为什么Go语言把类型声明放在后面? 为什么Go语言把类型声明放在后面? 今天小编就为大家分享一篇关于为什么Go语言把类型声明放在后面?,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧 继续阅读 >
202002-10 Go语言标准库之log介绍 log包定义了Logger类型,该类型提供了一些格式化输出的方法。 本包也提供了一个预定义的"标准"logger,可以通过调用Print系列(Print|Printf|Println)、Fatal系列(Fatal|Fatalf|fatalln)和Panic系列(Panic|Panicf|PanicLn)来使用,比自行创建一个logger对象更容易使用。 继续阅读 >
202002-10 什么是内存对齐?Go 是否有必要内存对齐? HOT 有的小伙伴可能会认为内存读取,就是一个简单的字节数组摆放。但实际上 CPU 并不会以一个一个字节去读取和写入内存,相反 CPU 读取内存是一块一块读取的,块的大小可以为 2、4、6、8、16 字节等大小,块大小我们称其为内存访问粒度。假设访问粒度为 4,那么 CPU 就会以每 4 个字节大小的访问粒度去读取和写入内存。 继续阅读 >
202002-10 为什么要内存对齐?Go 语言有时也需要考虑对齐的问题 HOT CPU 访问内存时,并不是逐个字节访问,而是以字长(word size)为单位访问。比如 32 位的 CPU,字长为 4 字节,那么 CPU 访问内存的单位也是 4 字节。 这么设计的目的,是减少 CPU 访问内存的次数,加大 CPU 访问内存的吞吐量。比如同样读取 8 个字节的数据,一次读取 4 个字节那么只需要读取 2 次。 下面我们来看看,编写程序时,变量在内存中是否按内存对齐的差异。 继续阅读 >
202002-09 Go语言的结构体 构造函数 Go语言的结构体 构造函数 Go语言的结构体没有构造函数,可以自己实现。 下面的代码就实现了一个Person的构造函数。因为struct是值类型,如果结构体比较复杂的话,值拷贝性能开销会比较大,所以该构造函数返回的是结构体指针类型。 继续阅读 >
202002-09 Go语言中间件框架 Negroni 的静态文件处理源码分析 HOT Negroni是一个非常棒的中间件,尤其是其中间件调用链优雅的设计,以及对GO HTTP 原生处理器的兼容。 继续阅读 >
202002-09 Go语言潜力有目共睹,但它的Goroutine机制底层原理你了解吗? HOT Go语言的巨大潜力有目共睹,今天我们来学习Go语言的Goroutine机制,这也可能是Go语言最为吸引人的特性了,理解它对于掌握Go语言大有裨益,话不多说开始吧! 通过本文你将了解到以下内容: 什么是协程以及横向对比优势 Go语言的Goroutine机制底层原理和特点 继续阅读 >
202002-08 Go语言(环境的搭建) HOT 下载地址 Go官网下载地址:https://golang.org/dl/ Go官方镜像站(推荐):https://golang.google.cn/dl/ 继续阅读 >