
在Go 1.6之前, 内置的map类型是部分goroutine安全的,并发的读没有问题,并发的写可能有问题。自go 1.6之后, 并发地读写map会报错,这在一些知名的开源库中都存在这个问题,所以go 1.9之前的解决方案是额外绑定一个锁,封装成一个新的struct或者单独使用锁都可以。
本文带你深入到sync.Map
的具体实现中,看看为了增加一个功能,代码是如何变的复杂的,以及作者在实现sync.Map
的一些思想。
在Go 1.6之前, 内置的map类型是部分goroutine安全的,并发的读没有问题,并发的写可能有问题。自go 1.6之后, 并发地读写map会报错,这在一些知名的开源库中都存在这个问题,所以go 1.9之前的解决方案是额外绑定一个锁,封装成一个新的struct或者单独使用锁都可以。
本文带你深入到sync.Map
的具体实现中,看看为了增加一个功能,代码是如何变的复杂的,以及作者在实现sync.Map
的一些思想。
原文地址: Golang Concurrency Tricks
Golang concurrency model based on goroutines and channels is not free from sharp edges.
This page intends both (1) to collect helpful guidelines for writing concurrent code in Go and (2) to bring up well known potential issues to attention.
原文: Idiomatic Go
什么样的代码才算最地道的Go代码? 这个问题经常被人问起,但是确不太好回答。部分原因在于我们还在摸索之中,抑或Go还是一个年轻的语言。随着语言和社区的逐渐成熟,老司机们才会对地道的Go代码达成共识。
请注意,地道的代码不是限制你的规则,而是代码指导。工作正常的代码比地道的代码更重要。因为所谓的地道,只是大家达成的一种共识,所以"不地道"的的代码不一定代表着错误。
既然没有确定的答案,我在本文中收集了相关的参考资料, 以飨读者。
原文: Lint your #golang code like a mad man!, 作者: Arsham Shirvani
我使用下面的工具来改进我的代码,除了vendor
文件夹。我的操作系统是GNU/Linux
,但是稍微修改一下脚本应该也能运行在你的操作系统上。我使用glide来处理依赖(vendor),但你也可以使用你的包依赖管理工具来替换glide nv
, 这个命令列出了所有的文件夹,除了vender (译者按: Go 1.9中可以直接使用./...
,它会排除vendor文件夹)。有些情况下glide nv
不适合,所以我使用了它的老式风格。
注意我使用$
作为shell的提示符。
如你所知, 类型别名(type aliases) 最终还是加入到Go 1.9中, Go 1.9 beta2今天已经发布了, 正式版预计8月初发布, 是时候深入了解一下它的新特性了,本文介绍的就是它的重要的新特性之一: 类型别名。
当然,如果你想尝试这些新特性,需要安装Go 1.9的版本,目前是beta2版,可以在官方网站下载。
taowen是json-iterator的作者。 序列化和反序列化需要处理JSON和struct的关系,其中会用到一些技巧。 原文 Golang 中使用 JSON 的小技巧是他的经验之谈,介绍了一些struct解析成json的技巧,以及 json-iterator 库的一些便利的处理。
有的时候上游传过来的字段是string类型的,但是我们却想用变成数字来使用。 本来用一个json:",string" 就可以支持了,如果不知道golang的这些小技巧,就要大费周章了。
参考文章:http://attilaolah.eu/2014/09/10/json-and-struct-composition-in-go/
原文: Advanced command execution in Go with os/exec by Krzysztof Kowalczyk.
完整代码在作者的github上: advanced-exec
Go可以非常方便地执行外部程序,让我们开始探索之旅吧。
熟悉C++、Java、C#等面向对象的编程语言的同学,在学习Go语言的过程中,经常会被访问权限所困扰,逐渐才能了解这样一个事实:
Go语言通过identifier
的首字母是否大写来决定它是否可以被其它package所访问。
正式的Go语言规范是这么规定的:
An identifier may be exported to permit access to it from another package. An identifier is exported if both:
the first character of the identifier's name is a Unicode upper case letter (Unicode class "Lu"); and
the identifier is declared in the package block or it is a field name or method name.All other identifiers are not exported.
这个Go语言规范定义的访问权限控制方法。