這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
最地道的Go代碼就是Go的標準庫的代碼,有空的時候可以多看看Google的工程師是如何?的。
1. 注釋
可以通過/* ... */或者//增加註釋, //之後應該有個空格
如果想在每個檔案的頭部加上注釋,需要在著作權注釋和Package前面加一個空行,否則著作權注釋會作為package的注釋
// Copyright 2009 The Go Authors. All rights reserved.// Use of this source code is governed by a BSD-style// license that can be found in the LICENSE file./*Package net provides a portable interface for network I/O, includingTCP/IP, UDP, domain name resolution, and Unix domain sockets.......*/package net......
註:注釋應該用一個完整的句子,注釋的第一個單詞應該是要注釋的指示符,以便在godoc中容易尋找;
注釋應該以 . 結尾;
2. 聲明slice
使用下面這種方式聲明slice:
var s []string
而不是下面這種格式
t := []string{}
註:前者聲明了一個nilslice, 而後者聲明了一個長度為0的非nilslice
3. 字串的大小寫
錯誤字串不應該大寫,應寫成:
fmt.Errorf("failed to write data.")
而不是寫成:
fmt.Errorf("Failed to write data")
因為,這些字串可能和其他字串相串連,組合後的字串如果中間有大寫字母開頭的單詞很突兀,除非這些首字母大寫單詞是固定使用的單詞。
註:縮寫詞必須保持一致,比如都大寫URL或者小寫url;
常亮一般聲明為MaxLength,而不是以底線分割MAX_LENGTH或者MAXLENGTH;
4.處理error而不是panic或者忽略
為了代碼的強健性,不要使用_忽略錯誤,而是要處理每一個錯誤,儘管代碼寫起來有些繁瑣也不要忽略錯誤;
盡量不要使用panic;
5. 一些名稱
包名應該使用單數形式,比如util,model,而不是utils,models;
Receiver的名稱應該縮寫,一般使用一個或兩個字元作為Receiver的名稱,如:
func (f foo) method { ...}
有些單詞可能有多種寫法,在項目中應保持一致,比如Golang採用的寫法:
// marshaling// unmarshaling// canceling// cancelation
而不是:
// marshalling// unmarshalling// cancelling// cancellation
6.Null 字元串檢查
正確方式:
if s == "" { ...}
而不是:
if len(s) == 0 { ...}
更不是:
if s == nil || s == ""{ ...}
7.非空slice檢查
正確方式:
if len(s) > 0 { ...}
而不是:
if s != nil && len(s) > 0 { ...}
8. 直接使用bool值
對於bool類型的變數var b bool, 直接使用它作為判斷,而不是使用它和true/false進行比較
正確方式:
if b { ...}if !b { ...}
而不是:
if b == true { ...}if b == false { ...}
9. byte/slice/string相等性比較
var s1 []bytevar s2 []byte ...bytes.Equal(s1, s2) == 0bytes.Equal(s1, s2) != 0
而不是:
var s1 []bytevar s2 []byte ...bytes.Compare(s1, s2) == 0 bytes.Compare(s1, s2) != 0
10. 檢查是否包含子字串
應使用strings.ContainesRune, strings.ContainesAny, strings.Contains
11. 複製slice
使用內建函數copy,而不是遍曆slice逐個複製
正確方式
var b1, b2 []bytecopy(b2, b1)
12. 盡量縮短if
正確方式:
var a, b int ... return a > b
而不是:
var a, b int ... if a > b { return true } else { return false }
13.簡化range
正確方式:
for range m { ... }
而不是:
var m map[string]int for _ = range m { } for _, _ = range m { }
14.使用strings.TrimPrefix / strings.TrimSuffix
正確方式:
var s1 = "a string value" var s2 = "a " var s3 = strings.TrimPrefix(s1, s2)
而不是:
var s1 = "a string value" var s2 = "a " var s3 string if strings.HasPrefix(s1, s2) { s3 = s1[len(s2):] }
15.append slice
正確方式:
var a, b []byte a = append(b, a...)
而不是:
var a, b []byte for _,v range a { append(b, v) }
參考文檔
http://colobu.com/2017/02/07/write-idiomatic-golang-codes/
effective go