【GoLang】50 个 Go 开发者常犯的错误
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
【GoLang】50 个 Go 开发者常犯的错误的更多相关文章
- PHP开发者常犯的MySQL错误
PHP开发者常犯的MySQL错误 数据库是WEB大多数应用开发的基础.如果你是用PHP,那么大多数据库用的是MYSQL也是LAMP架构的重要部分. PHP看起来很简单,一个初学者也可以几个小时内就 ...
- 零基础怎么学Python编程,新手常犯哪些错误?
Python是人工智能时代最佳的编程语言,入门简单.功能强大,深获初学者的喜爱. 很多零基础学习Python开发的人都会忽视一些小细节,进而导致整个程序出现错误.下面就给大家介绍一下Python开发者 ...
- C#新手常犯的错误
虽然这篇post的标题是新手常犯的错误,实际上很多有经验的程序员也经常犯这些错误,我整理了一下,就当是笔记.1.遍历List的错误,比如如下代码: List<String> strList ...
- 网站移植到linux上后常犯的错误
常犯的错误 1:gcc库没装或者没装全 表现:没有可用的C编译器 同类错误:提示g++ not found, 解决:出现以上错误,则是因为gcc编译器没装,或者是没装全. 挂载光盘,到Pakeges里 ...
- Java开发者常犯的十个错误
翻译自:Top 10 Mistakes Java Developers Make 文章列出了Java开发者最常犯的是个错误. 1.将数组转换为ArrayList 为了将数组转换为ArrayList,开 ...
- python开发者常犯的10个错误(转)
常见错误1:错误地将表达式作为函数的默认参数 在Python中,我们可以为函数的某个参数设置默认值,使该参数成为可选参数.虽然这是一个很好的语言特性,但是当默认值是可变类型时,也会导致一些令人困惑的情 ...
- 在CMMI推广过程中EPG常犯的错误(转)
本文转自: http://developer.51cto.com/art/200807/86953.htm 仅用于个人收藏,学习.如有转载,请联系原作者. ---------------------- ...
- PHP开发者常犯的10个MySQL错误
原文出处: kaiyuanba 欢迎分享原创到伯乐头条 数据库是WEB大多数应用开发的基础.如果你是用PHP,那么大多数据库用的是MYSQL也是LAMP架构的重要部分. PHP看起来很简单,一个初 ...
- PHP 开发者常犯的 10 个 MySQL 错误
数据库是WEB大多数应用开发的基础.如果你是用PHP,那么大多数据库用的是MYSQL也是LAMP架构的重要部分. PHP看起来很简单,一个初学者也可以几个小时内就能开始写函数了.但是建立一个稳定.可靠 ...
随机推荐
- VS代码段扩展Snippet Designer is a Visual Studio plug in which allows you to create and search for snippets inside the IDE
Snippet Designer is a Visual Studio plug in which allows you to create and search for snippets insid ...
- owin
app.Properties["Hello"] = System.DateTime.Now; app.Run(async context => await context.R ...
- PHPCMS 模板制作标签
内容模块: 栏目调用1: {pc:content action="category" catid="0" num="25" siteid=& ...
- Yii2提交表单提示无法验证
yii2使用gii生成的搜索视图里的表单使用的是get方式,我改为post就提示无法验证,以为是控制器默认访问是get,实际默认是get和post都可以 public function behavio ...
- 密钥文件snk
1.(what)是什么? 由一个程序集的标识组成并通过公钥和数字签名(针对该程序集生成)加强的名称,其中的标识包括程序集的简单文 本名称.版本号和区域性信息(如果提供的话). 2.(why)为什么 ...
- Xcode常用技巧(1)-使用Xcode进行代码分析及GDB调试
1. 使用Xcode分析代码,分析分为静态分析及动态分析 静态分析:(Xcode-Product-Analyze) 检测代码是否有潜在的内存泄露 编译器认为不太合适的代码 运行结果: 若程序有 ...
- VS2015新建asp.net core站点
摘要 电脑上安装了vs2015,今天就尝尝鲜,新建一个项目试试. BBS 使用vs2015新建一个解决方案,然后新建项目,此时你会发现没有asp.net core项目,这就需要先安装asp.net c ...
- EF-error 0152: No Entity Framework provider found...
突然就报这个错了... ... 哈哈··· 原来是 "EntityFramework.SqlServer.dll" 没有引用··· 添加引用就好了... ... 还好不了?那就不知 ...
- ansible的使用技巧
#查看ansible的帮助 $ ansible -h #ansible 指定不通的模块执行 $ ansible -i /etc/ansible/hosts docker -u root -m c ...
- 【C语言入门教程】2.8 C 语言的预处理命令
预处理命令是在程序编译阶段进行执行的命令,用于编译与特定环境相关的可执行文件.预处理命令扩展了 C 语言,本节将选择其中一些常用的预处理命令进行讲解. 2.8.1 宏替换命令 宏替换命令的作用类似于对 ...