50 个 Go 开发者常犯的错误

01. { 换行:   Opening Brace Can't Be Placed on a Separate Line

02. 定义未使用的变量:  Unused Variables

02. import 但未使用: Unused Imports

03. a := 123 简短变量定义方式只能在函数内部使用: Short Variable Declarations Can Be Used Only Inside Functions

04. 重复定义 简短变量: Redeclaring Variables Using Short Variable Declarations

05. 注意简短变量作用域: Accidental Variable Shadowing

06. nil 不能赋值给 不明类型的变量: Can't Use "nil" to Initialize a Variable Without an Explicit Type

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

08. map 只有 len操作, 没有 cap 操作: Map Capacity

09. 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容