• 开大括号不能放在单独的一行• 未使用的变量• 未使用的Imports• 简式的变量声明仅可以在函数内部使用• 使用简式声明重复声明变量• identalVariableShadowing• 不使用显式类型,无法使用“nil”来初始化变量• 使用“nil”SlicesandMaps• Map的容量• 字符串不会为nil• Array函数的参数• 在Slice和Array使用“range”语句时的出现的不希望得到的值• Slices和Arrays是一维的• 访问不存在的MapKeys• Strings无法修改• String和ByteSlice之间的转换• String和索引操作• 字符串不总是UTF8文本• 字符串的长度• 在多行的Slice、Array和Map语句中遗漏逗号• • 内建的数据结构操作不是同步的• String在“range”语句中的迭代值• 对Map使用“forrange”语句迭代• "switch"声明中的失效行为• 自增和自减• 按位NOT操作• 操作优先级的差异• 未导出的结构体不会被编码• 有活动的Goroutines下的应用退出• 向无缓存的Channel发送消息,只要目标接收者准备好就会立即返回• 向已关闭的Channel发送会引起Panic• 使用"nil"Channels• 传值方法的接收者无法修改原有的值• 关闭HTTP的响应• 关闭HTTP的连接• 比较Structs,Arrays,Slices,andMaps• 从Panic中恢复• 在Slice,Array,andMap"range"语句中更新引用元素的值• 在Slice中"隐藏"数据• Slice的数据“毁坏”• 陈旧的(Stale)Slices• 类型声明和方法• 从"forswitch"和"forselect"代码块中跳出• "for"声明中的迭代变量和闭包• Defer函数调用参数的求值• 被Defer的函数调用执行• 失败的类型断言• 阻塞的Goroutine和资源泄露• 使用指针接收方法的值的实例• 更新Map的值• "nil"Interfaces和"nil"Interfaces的值• 栈和堆变量• GOMAXPROCS,并发,和并行• 读写操作的重排顺序• 优先调度 Go是一门简单有趣的语言,但与其他语言类似,它会有一些技巧。。。这些技巧的绝大部分并不是Go的缺陷造成的。如果你以前使用的是其他语言,那么这其中的有些错误就是很自然的陷阱。其它的是由错误的假设和缺少细节造成的。 如果你花时间学习这门语言,阅读官方说明、wiki、邮件列表讨论、大量的优秀博文和RobPike的展示,以及源代码,这些技巧中的绝大多数都是显而易见的。尽管不是每个人都是以这种方式开始学习的,但也没关系。如果你是Go语言新人,那么这里的信息将会节约你大量的调试代码的时间。 初学者 开大括号不能放在单独的一行 在大多数其他使用大括号的语言中,你需要选择放置它们的位置。Go的方式不同。你可以为此感谢下自动分号的注入(没有预读)。是的,Go中也是有分号的:-)失败的例子: package main import "fmt"func main() { //error,can'( "hellothere!" ) } 编译错误: /tmp/sandbox826898458/:6:syntaxerror:unexpectedsemicolonornewlinebefore{ 有效的例子: package main import "fmt"func main(){ ( "works!" ) } 未使用的变量 如果你有未使用的变量,代码将编译失败。当然也有例外。在函数内一定要使用声明的变量,但未使用的全局变量是没问题的。 如果你给未使用的变量分配了一个新的值,代码还是会编译失败。你需要在某个地方使用这个变量,才能让编译器愉快的编译。 Fails: package main var gvar int //notanerrorfunc main(){ var one int //error,unusedvariabletwo:= 2 //error,unusedvariablevar three int //error,eventhoughit'hree= 3} CompileErrors: /tmp/sandbox473116179/:6:onedeclaredandnotused /tmp/sandbox473116179/:7:twodeclaredandnot
50个Go开发者常犯的错误 来自淘豆网m.daumloan.com转载请标明出处.