原文,文章作者也是《Hands-On Dependency Injection in Go》的作者,向原作者表示感谢。


你是否曾经由于添加某个新功能却导致另一个功能出问题?修复好这个,另一个又出问题,就好象打地鼠一般。

你是否曾经花费大量的时间调试Bug,最后却发现问题潜伏在另一个、甚至毫不相关的模块中?

这些问题都是由于高耦合引起的。

在这篇文章中,我们来使用解偶的方式来让代码更加易于理解、维护、测试。

阅读全文

go get命令使用socket代理

发布在 Golang

由于某些不可描述的原因,国内使用go get命令安装某些包的时候会超时导致失败,比如net包、sys包、tools包等。第一种解决办法就是自己从git上下载后添加链接到GOPATH中,比如:

1
2
3
4
5
6
7
8
9
git clone https://github.com/golang/net.git $GOPATH/src/github.com/golang/net

git clone https://github.com/golang/sys.git $GOPATH/src/github.com/golang/sys

git clone https://github.com/golang/tools.git $GOPATH/src/github.com/golang/tools

ln -s $GOPATH/src/github.com/golang $GOPATH/src/golang.org/

cd $GOPATH/src/golang.org/ && mv golang x

阅读全文

墨卡托坐标转经纬度

发布在 Golang

今天获取百度地图数据时候发现其坐标都是类似12945050.96,4826978.52这种而非常见的经纬度,之前获取百度外面商家信息时就发现了这个问题但没深入研究,搜索后发现这种表示方法叫做墨卡托坐标。不得不说,关于坐标的标准还真是挺多的,根据经纬度查询位置可以使用这个网站

阅读全文

原文,互斥锁(Mutex)也是go并发系列最后一篇文章。

临界区

在说互斥锁前,理解并发编程中的临界区(Critical section)是十分重要的。当一个程序并发执行时,共享资源不应该在同一时刻被多个goroutine修改。这段修改共享资源的代码就叫做临界区。举个例子,我们有一个代码片段用于修改变量x自增1。

1
x = x+1

如果上面的代码在唯一的goroutine中执行,不会有任何问题。

阅读全文

原文

什么是Select

select语法用来从多个读/写的channel中选择一个,如果没有任何channel就绪select语句将被阻塞。如果多个就绪,则随机选择一个。语法和switch类似,除了case后面跟随的是channel。

阅读全文

原文,这里为了方便理解我把worker pools翻译成线程池。

什么是缓冲区Channel

之前讨论的所有channel都是不带缓冲区的,因此读取和写入都会被阻塞。创建一个带缓冲区的channel也是可能的,这种channel只有在缓冲区满后再写入或者读取一个空的channel时才会被阻塞。

创建一个带缓冲区的channel需要一个额外的参数容量来表明缓冲区大小:

1
ch := make(chan type, capacity)

上面代码中的 capacity 需要大于0,如果等于0的话则是之前学习的无缓冲区channel。

阅读全文

原文,建议理解并发(concurrency)、并行(parallelism)区别后再看这方面的内容。

Goroutines是啥?

Goroutines是一个可以和其他函数或方法并发执行的函数或方法。也可以把它理解为轻量级的线程(roy注:这话听起来和大python中的协程很像啊!),而创建Goroutine的开销却远远小于线程。因此在大多数的Go程序都可以并发执行成千上万的Goroutine。

阅读全文
作者的图片

Roy

君以国士待我,我必以国士报君。


野生程序猿


China