一般的,用 Go 开发Web程序部署时,会使用 Nginx 作为反向代理。如果程序中需要获取用户的 IP,直接使用 http.Request.RemoteAddr 获取到的是 Nginx 服务器的 IP。本文介绍了这种情况下如何获取用户的 IP。也欢迎提供其他获取 IP 的方案。 我要晨读

已有1482人晨读

在使用go的过程中,我们有时候会引入一些第三方库来使用,而通常的方式就是使用go get,但是这种方式有一个很严重的问题,如果第三方库更新了相关接口,很有可能你就无法使用了。当然,还有其他方式,比如:check下来放在工程目录;使用 godep 或 gpm 这样的管理工具。本文介绍 mgo 库使用的方式:gopkg,它引入了版本的概念。 我要晨读  相关阅读: 网页链接  网页链接 

已有830人晨读

并发编程,必然会遇到同步问题;虽然 Go 推崇通过 channel 来处理同步问题,然而,有些时候使用锁会更方便。本文分析了 Mutex 设计思想和演化过程,得出如下结论:理解一个程序如何工作很简单,但是,作者的设计思路才是关键,我们可以不断的看源代码,看别人的实现,我们能从中学到很多知识与技巧,当遇到相同的问题的时候,我们也能解决类似的问题。 我要晨读

已有933人晨读

Slice/array(以及字符串)是经常使用的数据类型,使用它们的地方,经常可以见到 append 内置函数的身影。你应该知道 append 的作用,然而,你知道 append 的运作机制吗?了解其原理,无疑对写出高质量的代码很有好处。该文原文来自Go官网博客,可以对照着原文看这篇译文。 我要晨读

已有1720人晨读

工欲善其事,必先利其器。进行开发工作,搭建一个好用的开发环境往往能加快开发速度。编辑器之争没有意义,每个人都会有自己喜爱的编辑器。如果你还在迷茫于Go开发环境的问题,不妨读读这篇文章:打造完美的go开发环境。另外,可以使用下 fswatch Golang 热编译工具。 我要晨读  相关阅读: 网页链接 

已有1019人晨读

上次晨读了 container/list 包的实现。然而光学不用,很容易就会忘记。如何使用 container/list 包来实现一个排序的链表;又如何使用 container/list 包来实现一个 Stack(栈)。当然,这两种数据结构也可以不使用 container/list 来实现。欢迎分享其他实现。 我要晨读  相关阅读: 网页链接 

已有880人晨读

container/list 包实现了一个双端链表,其实现(包括注释)一共就200多行代码。通过学习其实现复习链表等相关知识。本文不是带领大家学习list的内部实现,而是提到list使用时的一个“坑”,建议通过这个“坑”学习下list的内部实现。 我要晨读

已有1798人晨读

常听到的是Go是云时代的语言;同时,也经常听到:Go 适合网游服务器端开发。没涉及过网游开发的工作,不知道为啥 Go 适合。本文介绍了网游的一些基本情况,程序需要处理的核心工作、主要IO等,进而分析为什么Go语言适合开发网游服务器端。 我要晨读  相关阅读: 网页链接 

已有992人晨读

goroutine 是如此的重要,以至于学习、应用 goroutine 相关的文章层出不穷。本文简单介绍了并发、并行的知识,同时介绍了goroutine的一些基本知识,然后通过例子一步步学习实践goroutine的使用。建议阅读过程中实际动手实验,以加深理解。本序列一共分两篇。 我要晨读  相关阅读: 网页链接 

已有980人晨读

Goroutine 和 channel 可以说是Go语言的两大法宝。在学习Go语言的过程中,大家应该或多或少都会使用到 channel。然而,对 channel 你了解多少?本文介绍了 channel 的一些特性(或技巧),同时还提供了一个 http 请求优化的方案。 我要晨读

已有1198人晨读

对于Go初学者,可能对内置函数 new 和 make 的使用挺迷糊的:什么时候该使用 new,什么时候该使用 make?它们之间到底有啥区别?本文结合 C/C++ 分析了 new 和 make 所做的工作以及一些内部原理。相信看完后,你对两者的区别和使用应该不会有问题了。 我要晨读

已有881人晨读

Go中的nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值;Go中的interface有其独到之处:只要类型T的公开方法完全满足接口I的要求,就可以把类型T的对象用在需要接口I的地方。这种做法的学名叫做Structural Typing。本文详细介绍了interface和nil,包括内部的一些实现。 我要晨读

已有970人晨读

如果你成天与编程为伍,那么并发这个名词对你而言一定特别耳熟。需要并发的场景太多了,例如一个聊天程序,如果你想让这个聊天程序能够同时接收信息和发送信息,就一定会用到并发,无论那是什么样的并发。本文通过并发的启动、sync.WaitGroup和channel等来介绍Go语言的并发。 我要晨读

已有902人晨读

Go语言提供了一些很好的工具,方便查看运行时的各种状态,比如内存使用、GC、goroutine等。本文在实际项目中通过 pprof 检查 goroutine “泄露”,并给出了 pprof 的简单使用。 我要晨读

已有878人晨读

语言之争、编辑器之争是程序员们很热衷的话题,语言也好,编辑器也好,没有哪个是所有人都会喜欢的,你觉得好、合适就用,不喜欢完全可以不用。本文根据作者的实践经历和对其他语言使用,道出作者为什么选择Go语言,你为什么选择Go语言呢? 我要晨读

已有841人晨读

当我们编写的go代码依赖特定平台或者cpu架构的时候,我们需要给出不同的实现。C语言有预处理器,可以通过宏或者#define包含特定平台指定的代码进行编译。但是Go没有预处理器,他是通过 go/build包 里定义的tags和命名约定来让Go的包可以管理不同平台的代码。这篇文章将讲述Go的条件编译系统是如何实现的,并且通过实例来说明如何使用。 我要晨读

已有1129人晨读

排序算法有很多,你是否听过“睡眠排序算法”?该算法虽然实用价值不高,但挺受启发的,重点是它实在是太欢乐了。今天的晨读就娱乐一把,睡眠排序算法的Go语言实现。本文的实现可能不是太好,你也动手实现一个? 我要晨读

已有988人晨读

学习Go语言的应该都知道,几行代码就可以搭建一个 HTTP 服务,然而,你是否了解这几行代码的原理呢?它内部都做了什么事情?为什么这么几行代码就能够提供服务?本文通俗易懂的介绍了 http 服务几个关键元素的原理,推荐阅读。 我要晨读

已有789人晨读

对静态语言来说,反射是很重要的一个特性,运用的好,可以减少很多的代码,做到通用。大部分框架,都或多或少会使用反射功能。Go语言一样提供了强大的反射能力,学习Go语言,有必要掌握反射的使用。本文由类型转换引入反射,通过一个具体的例子来介绍反射的使用 我要晨读

已有852人晨读

Go标准库中的time包是一个常用的包,提供了日期时间相关的各种类型和操作,也许你还没用过time包,也许你经常使用time包,无论你属于哪一种,都可以跟着本文重新看看time包,本文图文并茂的讲解了time包的用法。 我要晨读

已有978人晨读