[译]像牛人一样改进你的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的提示符。

阅读全文

了解 Go 1.9 的类型别名

如你所知, 类型别名(type aliases) 最终还是加入到Go 1.9中, Go 1.9 beta2今天已经发布了, 正式版预计8月初发布, 是时候深入了解一下它的新特性了,本文介绍的就是它的重要的新特性之一: 类型别名。

当然,如果你想尝试这些新特性,需要安装Go 1.9的版本,目前是beta2版,可以在官方网站下载。

阅读全文

[转]Golang 中使用 JSON 的小技巧

taowenjson-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/

阅读全文

突破限制,访问其它Go package中的私有函数

熟悉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语言规范定义的访问权限控制方法。

阅读全文

[转]通过 raft 的 leader lease 来解决集群脑裂时的 stale read 问题

PingCap联合创始人、CTO 黄东旭写的一篇解决Raft网络分区的一种方案: 通过 raft 的 leader lease 来解决集群脑裂时的 stale read 问题。本文转载之。

问题: 当 raft group 发生脑裂的情况下,老的 raft leader 可能在一段时间内并不知道新的 leader 已经被选举出来,这时候客户端在老的 leader 上可能会读取出陈旧的数据(stale read)。 比如,我们假想一个拥有 5 个节点的 raft group:

阅读全文

[译]Go 调度器: M, P 和 G

这是另一篇关于Go调度器(scheduler)的文章。 原文: GO SCHEDULER: MS, PS & GS by Uber工程师 Povilas。

网上已经有很多关于Go调度器的文章了, 比如Golang调度器源码分析,多看一些,可以加深记忆,也可以对比查看文章中是否有不准确的地方,更全面的了解Go的调度器。

我决定深入了解Go的内部机制, 因为很长时间没人写关于Go scheduler的文章了, 我觉得这是一个很有趣的知识点,所以让我们开始吧。

阅读全文

Go HTTP Redirect的知识点总结

HTTP 规范中定义了返回码为 3xx 代表客户端需要做一些额外的工作来完成请求,大部分3xx用来做转发(redirect)。

状态码的详细说明可以参照规范或者 wikipedia维基百科, 以下是代码的简短介绍。

  • 300 Multiple Choices: 返回多个可供选择的资源
  • 301 Moved Permanently: 请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一
  • 302 Found: 请求的资源现在临时从不同的URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求,HTTP 1.0中的意义是Moved Temporarily,但是很多浏览器的实现是按照303的处实现的,所以HTTP 1.1中增加了 303和307的状态码来区分不同的行为
  • 303 See Other (since HTTP/1.1): 对应当前请求的响应可以在另一个URI上被找到,而且客户端应当采用GET的方式访问那个资源
  • 304 Not Modified (RFC 7232): 请求的资源没有改变
  • 305 Use Proxy (since HTTP/1.1): 被请求的资源必须通过指定的代理才能被访问
  • 306 Switch Proxy: 在最新版的规范中,306状态码已经不再被使用
  • 307 Temporary Redirect (since HTTP/1.1): 请求的资源现在临时从不同的URI响应请求,和303不同,它还是使用原先的Method
  • 308 Permanent Redirect (RFC 7538): 请求的资源已永久移动到新位置,并且新请求的Method不能改变

Go 的 http 库在实现的过程中也在不断的完成和修改其中的Bug,在 1.8版本中解决了前面版本中实现的问题 (你可以在 Go issues中搜索 redirect 来查看相关的issue)。 本文梳理了 Go 中 Redirect 的相关知识,以便你在遇到转发的问题时心中有数。

阅读全文