【GoLang】50 個 Go 開發人員常犯的錯誤

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

1. { 換行:   Opening Brace Can't Be Placed on a Separate Line    

2. 定義未使用的變數:  Unused Variables

2. import 但未使用: Unused Imports

3. a := 123 簡短變數定義方式只能在函數內部使用: Short Variable Declarations Can Be Used Only Inside Functions

4. 重複定義 簡短變數: Redeclaring Variables Using Short Variable Declarations

5. 注意簡短變數範圍: Accidental Variable Shadowing

6. nil 不能賦值給 不明類型的變數: Can't Use "nil" to Initialize a Variable Without an Explicit Type

7. map 未初始化 直接使用: Using "nil" Slices and Maps------interfaces, functions, pointers, maps, slices, and channels

8. map 只有 len操作, 沒有 cap 操作: Map Capacity

9. string 預設值為 "", 不是 nil, nil 也不能賦值給 string, string 在go中是實值型別,不是參考型別:  Strings Can't Be "nil"

10. array 是實值型別, 作為參數其值不會被改變, 形參複製了一份資料給實參; 如果確實需要改變, 需要使用數組指標 或者 slice切片 作為形參: Array Function Arguments

11. for range 遍曆返回兩個參數k, v, 不是一個參數: Unexpected Values in Slice and Array "range" Clauses

12. 慎用 多維陣列、多維slice,需要分步驟make才能完成: Slices and Arrays Are One-Dimensional

13. 請判斷 map 中 key 是否存在, 否則可能造成未知錯誤, 因為key不存在取出來也是有值的, 沒有異常!哈哈,GO 就是這麼逆天!不知道沒有完善的異常處理機制是不是GO最大的敗筆 : Accessing Non-Existing Map Keys

14. string是實值型別,不可迭代,如果需要迭代可以轉化為 []byte 進一步處理: Strings Are Immutable

15. string 可以用下標引用,不能用下表進行修改,string儲存使用 UTF8,string的處理建議使用 []rune 轉化為Unicode之後進行,或者使用GO的UTF8包中的介面: Strings and Index Operator

16. 請檢查你的輸入string是否為utf8格式, 然後繼續處理,這樣可以防止意外的錯誤: Strings Are Not Always UTF8 Text

17.  擷取字串長度請最好使用 UTF8包的函數 統計Unicode字元數,GO預設統計的是UTF8編碼的字串位元組長度,即實際記憶體中儲存的長度: String Length

18. array、slice、map等多行賦值需要添加 , 否則編譯失敗: Missing Comma In Multi-Line Slice, Array, and Map Literals

19. log.Fatal and log.Panic Do More Than Log 直接宣告Panic 退出: log.Fatal and log.Panic Do More Than Log

20. GO 內建的資料結構, 比如 map,非安全執行緒,需要自己處理: Built-in Data Structure Operations Are Not Synchronized

21. 迭代 string 會自動轉化為 Unicode 字元輸出, 請保證輸入的string為UTF8格式: Iteration Values For Strings in "range" Clauses

22. map 的輸出是 無序 的: Iterating Through a Map Using a "for range" Clause

23. switch-case 預設有break, 如果需要取消 , 請使用  fallthrough: Fallthrough Behavior in "switch" Statements

24. GO 語言 沒有 ++/-- 運算子: Increments and Decrements

25. GO 語言中, ^ 既是按位取反操作符,也是異或的操作符,沒有 ~ 操作符: Bitwise NOT Operator

26.  注意按位操作的順序,請使用括弧明確表示: Operator Precedence Differences

27. struct 小寫變數不會被序列化: Unexported Structure Fields Are Not Encoded

28. 主線程不會主動等待所有 Goroutine 完成: App Exits With Active Goroutines

29. 向無緩衝的Channel發送訊息,只要目標接收者準備好就會立即返回(與此相反,從無緩衝buffer接收資料則會一直阻塞直到有資料): Sending to an Unbuffered Channel Returns As Soon As the Target Receiver Is Ready

30. 向已關閉的Channel發送會引起Panic(從一個關閉的channel接收是安全的。在接收狀態下的 ok的傳回值將被設定為 false),就是說,不要直接粗暴的關閉channel,最好需要在夠routine中 select close訊號: Sending to an Closed Channel Causes a Panic

31. 使用"nil" Channels是不對的,需要先用make進行初始化,否則會拋出 deadlock 異常: Using "nil" Channels

32. 傳值方法的接收者無法修改原有的值: Methods with Value Receivers Can't Change the Original Value

33. 正確關閉HTTP的響應,防止記憶體泄露或者PANIC:Closing HTTP Response Body

34. 關閉HTTP的串連(req.Close = true 或者 req.Header.Add("Connection", "close") 或者 你也可以取消http的全域串連複用): Closing HTTP Connections

35. 可以使用 == 、reflect.deepEquals 比較Structs, Arrays, Slices, and Maps:Comparing Structs, Arrays, Slices, and Maps

36. 從Panic中恢複(recover()的調用僅當它在defer函數中被直接調用時才有效):Recovering From a Panic

37. 在Slice, Array, and Map "range"語句中更新引用元素的值是無效的(在“range”語句中產生的資料的值是真實集合元素的拷貝。它們不是原有元素的引用,如果你需要更新原有集合中的資料,使用索引操作符來獲得資料):Updating and Referencing Item Values in Slice, Array, and Map "range" Clauses

38. slice可以直接返回,所以如果不是要對原來的slice直接操做,請copy之後再返回:"Hidden" Data in Slices

39. Slice的資料“毀壞”(slice會被直接引用,請注意資料保護):Slice Data "Corruption"

40. "走味的"Slices(同上):"Stale" Slices

41. 當你通過把一個現有(非interface)的類型定義為一個新的類型時,新的類型不會繼承現有類型的方法,如果你確實需要原有類型的方法,你可以定義一個新的struct類型,用匿名方式把原有類型嵌入其中:Type Declarations and Methods

42. 從"for switch"和"for select"代碼塊中跳出,如果無法使用“return”聲明的話,那就為外部迴圈定義一個標籤是另一個好的選擇:Breaking Out of "for switch" and "for select" Code Blocks

43. "for"聲明中的迭代變數和閉包:Iteration Variables and Closures in "for" Statements

44. Defer函數調用參數的求值,被defer的函數的參數會在defer聲明時求值(而不是在函數實際執行時):Deferred Function Call Argument Evaluation

45. 被Defer的函數調用執行,在函數之內執行,而不是代碼塊內執行:Deferred Function Call Execution

46. 失敗的類型斷言:Failed Type Assertions

47. 阻塞的Goroutine和資源流失:Blocked Goroutines and Resource Leaks

48. 使用指標接收方法的值的執行個體, 並不是所有的變數是可取址的。Map的元素就不是。通過interface引用的變數也不是:Using Pointer Receiver Methods On Value Instances

49. 更新Map的值, 如果你有一個struct值的map,你無法更新單個的struct值: Updating Map Value Fields

50. "nil" Interfaces和"nil" Interfaces的值(返回 interface時請注意 nil): "nil" Interfaces and "nil" Interfaces Values

51. 棧和堆變數位置不確定:Stack and Heap Variables

52. GOMAXPROCS, 並發, 和並行(預設情況下,Go僅使用一個執行內容/OS線程(在當前的版本)。這個數量可以通過設定 GOMAXPROCS來提高): GOMAXPROCS, Concurrency, and Parallelism

53. 讀寫操作的重排順序: Read and Write Operation Reordering

54. 優先調度(有可能會出現這種情況,一個無恥的goroutine阻止其他goroutine運行。當你有一個不讓調度器啟動並執行 for迴圈時,這就會發生):Preemptive Scheduling 

 

參考資料:

http://www.tuicool.com/articles/ANzQNbf

http://studygolang.com/articles/7995

http://studygolang.com/articles/7994

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.