編寫地道的Go代碼

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

最地道的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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.