Go 语言 12 条最佳实践

本文来自 Google 工程师 Francesc Campoy Flores 分享的幻灯片。内容包括:代码组织、API、并发最佳实践和一些推荐的相关资源。

 

最佳实践

维基百科的定义是:

“最佳实践是一种方法或技术,其结果始终优于其他方式。”

写Go代码的目标就是:

  • 简洁
  • 可读性强
  • 可维护性好

样例代码

避免嵌套的处理错误

减少嵌套意味着提高代码的可读性

尽可能避免重复

功能单一,代码更简洁

使用类型推断来处理特殊情况

类型推断的变量声明要短

函数适配器

如何组织代码

 

将重要的代码放前面

版权信息,构建信息,包说明文档

Import 声明,相关的包连起来构成组,组与组之间用空行隔开.。

接下来代码以最重要的类型开始,以工具函数和类型结束。

 

如何编写文档

包名之前要写相关文档

导出的标识符(译者按:大写的标识符为导出标识符)会出现在 godoc中,所以要正确的编写文档。

生成的文档示例

Gocode: 文档化Go代码

 

越简洁越好

或者 长代码往往不是最好的.

试着使用能自解释的最短的变量名.

  • 用 MarshalIndent ,别用 MarshalWithIndentation.

别忘了包名会出现在你选择的标识符前面

  • In package encoding/json we find the type Encoder, not JSONEncoder.
  • It is referred as json.Encoder.

 

有多个文件的包

需要将一个包分散到多个文件中吗?

  • 避免行数非常多的文件

标准库中 net/http 包有47个文件,共计 15734 行.

  • 拆分代码并测试

net/http/cookie.go 和 net/http/cookie_test.go  都是 http 包的一部分.

测试代码 只有 在测试时才会编译.

  • 多文件包的文档编写

如果一个包中有多个文件, 可以很方便的创建一个 doc.go 文件,包含包文档信息.

让包可以”go get”到

一些包将来可能会被复用,另外一些不会.

定义了一些网络协议的包可能会在开发一个可执行命令时复用.

github.com/bradfitz/camlistore

 

接口

你需要什么

让我们以之前的Gopher类型为例

我们可以定义这个方法

但是使用一个具体的类型会让代码难以测试,因此我们使用接口.

进而,由于使用的是接口,我们可以只请求我们需要的.

让独立的包彼此独立

解析

描绘

使用接口来避免依赖.

测试

使用接口而不是具体类型让测试更简洁.

在接口中避免并发

如果我们想串行的使用它会怎样?

暴露同步的接口,这样异步调用这些接口会简单.

 

并发的最佳实践

 

使用goroutines管理状态

使用chan或者有chan的结构体和goroutine通信

使用带缓存的chan,来避免goroutine内存泄漏

  • goroutine阻塞在chan写操作
  • goroutine保存了一个chan的引用
  • chan永远不会垃圾回收

如果我们不能预测channel的容量呢?

使用quit chan避免goroutine内存泄漏

12条最佳实践

1. 避免嵌套的处理错误
2. 尽可能避免重复
3. 将重要的代码放前面
4. 为代码编写文档
5. 越简洁越好
6. 讲包拆分到多个文件中
7. 让包”go get”到
8. 按需请求
9. 让独立的包彼此独立
10. 在接口中避免并发
11. 使用goroutine管理状态
12. 避免goroutine内存泄漏

一些链接

资源

其他演讲

  • 用go做词法扫描 video
  • 并发不是并行 video
  • Go并发模式 video
  • Go高级并发模式 video

谢谢

Francesc Campoy Flores

Gopher at Google

@campoy83

http://campoy.cat/+

http://golang.org

1 3 收藏 评论

关于作者:Codefor

C.Monkey~since 2007 // (新浪微博:@codefor | 个人博客:danglab ) 个人主页 · 我的文章 · 1

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部