最地道的Go代碼就是Go的標(biāo)準(zhǔn)庫的代碼,有空的時(shí)候可以多看看Google的工程師是如何實(shí)現(xiàn)的融欧。
1. 注釋
可以通過/* ... */或者//增加注釋, //之后應(yīng)該有個(gè)空格
如果想在每個(gè)文件的頭部加上注釋,需要在版權(quán)注釋和Package前面加一個(gè)空行,否則版權(quán)注釋會(huì)作為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, including
TCP/IP, UDP, domain name resolution, and Unix domain sockets.
......
*/
package net
......
注:注釋應(yīng)該用一個(gè)完整的句子匠璧,注釋的第一個(gè)單詞應(yīng)該是要注釋的指示符桐款,以便在godoc中容易查找;
注釋應(yīng)該以 .
結(jié)尾咸这;
2. 聲明slice
使用下面這種方式聲明slice:
var s []string
而不是下面這種格式
t := []string{}
注:前者聲明了一個(gè)nil
slice, 而后者聲明了一個(gè)長度為0的非nil
slice
3. 字符串的大小寫
錯(cuò)誤字符串不應(yīng)該大寫,應(yīng)寫成:
fmt.Errorf("failed to write data.")
而不是寫成:
fmt.Errorf("Failed to write data")
因?yàn)槟д#@些字符串可能和其他字符串相連接媳维,組合后的字符串如果中間有大寫字母開頭的單詞很突兀,除非這些首字母大寫單詞是固定使用的單詞遏暴。
注:縮寫詞必須保持一致侄刽,比如都大寫URL或者小寫url;
常亮一般聲明為MaxLength朋凉,而不是以下劃線分割MAX_LENGTH或者M(jìn)AXLENGTH州丹;
4.處理error而不是panic或者忽略
為了代碼的強(qiáng)健性,不要使用_忽略錯(cuò)誤杂彭,而是要處理每一個(gè)錯(cuò)誤墓毒,盡管代碼寫起來有些繁瑣也不要忽略錯(cuò)誤;
盡量不要使用panic;
5. 一些名稱
包名應(yīng)該使用單數(shù)形式亲怠,比如util,model,而不是utils,models;
Receiver的名稱應(yīng)該縮寫所计,一般使用一個(gè)或兩個(gè)字符作為Receiver的名稱,如:
func (f foo) method {
...
}
有些單詞可能有多種寫法团秽,在項(xiàng)目中應(yīng)保持一致主胧,比如Golang采用的寫法:
// marshaling
// unmarshaling
// canceling
// cancelation
而不是:
// marshalling
// unmarshalling
// cancelling
// cancellation
6.空字符串檢查
正確方式:
if s == "" {
...
}
而不是:
if len(s) == 0 {
...
}
更不是:
if s == nil || s == ""{
...
}
7.非空slice檢查
正確方式:
if len(s) > 0 {
...
}
而不是:
if s != nil && len(s) > 0 {
...
}
8. 直接使用bool值
對(duì)于bool類型的變量var b bool, 直接使用它作為判斷叭首,而不是使用它和true/false進(jìn)行比較
正確方式:
if b {
...
}
if !b {
...
}
而不是:
if b == true {
...
}
if b == false {
...
}
9. byte/slice/string相等性比較
var s1 []byte
var s2 []byte
...
bytes.Equal(s1, s2) == 0
bytes.Equal(s1, s2) != 0
而不是:
var s1 []byte
var s2 []byte
...
bytes.Compare(s1, s2) == 0
bytes.Compare(s1, s2) != 0
10. 檢查是否包含子字符串
應(yīng)使用strings.ContainesRune, strings.ContainesAny, strings.Contains
11. 復(fù)制slice
使用內(nèi)建函數(shù)copy,而不是遍歷slice逐個(gè)復(fù)制
正確方式
var b1, b2 []byte
copy(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)
}