原文鏈接:https://golang.org/doc/effective_go.html
Introduction
Go是一種新興的編程語言。雖然它借鑒了現有語言的思想,但它具有不同尋常的特性,使得高效的Go程序與其他語言編寫的程序大不相同。將C ++或Java程序直接轉換為Go不太可能產生令人滿意的結果 - Java程序是用Java編寫的,而不是Go。另一方面,從Go語言的角度思考問題可能會產生一個成功但完全不同的程序。換句話說,要寫好Go,了解它的特性和語法是很重要的。了解Go中編程的既定約定也很重要,例如命名,格式化,程序構造等,這樣你編寫的程序將很容易讓其他Go程序員理解。
該文檔提供了編寫清晰,常用的Go代碼的技巧。 Language specification,Tour of Go和How to Write Go Code,這些都應該先閱讀。
Formatting(格式化)
格式化問題是最具爭議性但最不重要的問題。人們可以適應不同的格式化風格,但如果不是勉強去適應代碼風格,那就更好了,如果每個人都遵循相同的風格,那么關注在格式化上的時間就會減少。問題在於如何能夠長期在沒有規定風格的情況下達到這個理想的情況。
使用Go,我們采取了一種不尋常的方法,讓機器處理大多數格式問題。gofmt程序(也可作為go fmt,在包級別而不是源文件級別運行)讀取Go程序並以標准樣式的縮進和垂直對齊方式格式化源代碼,並在必要時重新格式化注釋。如果你想知道如何處理一些新的布局情況,請運行gofmt;如果結果似乎不正確,重新整理你的程序(或提交有關gofmt的錯誤),不必糾結於此。
例如,沒有必要花時間排列結構體中字段的注釋。Gofmt會去做的。給出結構體的聲明:
type T struct { name string // name of the object value int // its value }
gofmt會格式化為:
type T struct { name string // name of the object value int // its value }
標准包中的所有Go代碼都已經使用gofmt格式化過了。一些格式細節仍然存在,非常簡短:
- 縮進:我們使用tab進行縮進,gofmt默認使用的就是tab。僅在必要時使用空格。
- 每行的長度:Go中對每行的長度沒有限制,別擔心打孔卡不夠長。如果一行實在太長,可以換行然后使用tab進行縮進。
- 括號:Go中的括號要比C和Java少,控制結構(if,for,switch)的語法中沒有括號。此外,運算符優先級層次更短更清晰,因此在x<<8 + y<<16中間距說明了優先級,這與其他語言是不同的。
Commentary(注釋)
Go中支持C語言風格的/* */分段注釋和C++風格的//行注釋。通常使用的是行注釋;段注釋主要用在package的注釋,但在表達式中或禁用大量代碼時很有用。
程序和Web服務器-godoc處理Go源文件以提取有關package內容的文檔。出現在聲明之前的注釋(注釋與聲明之間沒有插入新的行)將與聲明一起提取,作為項目的解釋性文本。這些注釋的風格決定了godoc產生文檔的質量。
每個package在最開始都應該有一個段注釋。對於多文件package,package注釋只需要寫在一個文件中,任何一個都可以。package的注釋應該介紹package,並提供與整個package相關的信息。它將首先出現在godoc頁面上,應該建立如下所示的詳細文檔。
/* Package regexp implements a simple library for regular expressions. The syntax of the regular expressions accepted is: regexp: concatenation { '|' concatenation } concatenation: { closure } closure: term [ '*' | '+' | '?' ] term: '^' '$' '.' character '[' [ '^' ] character-ranges ']' '(' regexp ')' */ package regexp
如果package很簡單,那么package的注釋可以很簡短。
// Package path implements utility routines for // manipulating slash-separated filename paths.
Names(命名)
Semicolons(分號)