Go 語言 12 條最佳實踐

Codefor發表於2013-08-01

本文來自 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/+

相關文章