chapter 16

This commit is contained in:
leo
2016-03-22 23:25:50 +08:00
parent 0b31043b9b
commit 561f62a728
2 changed files with 71 additions and 0 deletions

30
eBook/16.0.md Normal file
View File

@@ -0,0 +1,30 @@
# 16 常见的陷阱与错误
在之前的内容中,有时候使用`!!...!!`标记警告go语言中的一些错误使用方式。当你在编程时候遇到的一个困难可以确定本书特定的章节能找到类似的主题。为了方便起见这里列出了一些常见陷进以便于你能发现更多的解释和例子
- 永远不要使用形如 `var p*a` 声明变量,这会混淆指针声明和乘法运算(参考[4.9小节](04.9.md)
- 永远不要在`for`循环自身中改变计数器变量(参考[5.4小节](05.4.md)
- 永远不要在`for-range`循环中使用一个值去改变自身的值(参考[5.4.4小节](05.4.md)
- 永远不要将`goto`和前置标签一起使用(参考[5.6小节](05.6.md)
- 永远不要忘记在函数名(参考[第6章](06.0.md))后加括号(),尤其调用一个对象的方法或者使用匿名函数启动一个协程时
- 永远不要使用`new()`一个map一直使用make参考[第8章](08.0.md)
- 当为一个类型定义一个String()方法时,不要使用`fmt.Print`或者类似的代码(参考[10.7小节](10.7.md)
- 永远不要忘记当终止缓存写入时,使用`Flush`函数(参考[12.2.3小节](12.2.md)
- 永远不要忽略错误提示,忽略错误会导致程序奔溃(参考[13.1小节](13.1.md)
- 不要使用全局变量或者共享内存,这会使并发执行的代码变得不安全(参考[14.1小节](14.1.md)
- `println`函数仅仅是用于调试的目的
最佳实践:对比以下使用方式:
- 使用正确的方式初始化一个`map[type]slice`(参考[8.1.3小节](08.1.md)
- 一直使用逗号ok或者checked形式作为类型断言参考[11.3小节](11.3.md)
- 使用一个工厂函数创建并初始化自己定义类型(参考[10.2小节](10.2.md)-[18.4小节](18.4.md)
- 仅当一个结构体的方法想改变结构体时,使用结构体指针作为方法的接受者,否则使用一个结构体值类型[10.6.3小节](10.6.md)
本章主要汇总了go语言使用过程中最常见的错误和注意事项。在之前的章节已经涉及到了完整的示例和解释你应该做的不仅仅是阅读这段的标题。
## 链接
- [目录](directory.md)
- 上一章:[使用SMTP简单邮件传输协议 Simple Message Transfer Protocol发送邮件](15.12.md)
- 下一节:[误用短声明导致变量覆盖](16.1.md)

41
eBook/16.1.md Normal file
View File

@@ -0,0 +1,41 @@
# 16.1 误用短声明导致变量覆盖
```go
var remember bool = false
if something {
remember := true //错误
}
// 使用remember
```
在此代码段中,`remember`变量永远不会在`if`语句外面变成`true`,如果`something``true`,由于使用了短声明`:=``if`语句内部的新变量`remember`将覆盖外面的`remember`变量,并且该变量的值为`true`,但是在`if`语句外面,变量`remember`的值变成了`false`,所以正确的写法应该是:
```go
if something {
remember = true
}
```
此类型的错误也容易在`for`循环中出现,尤其当函数返回一个具名变量时难于察觉
,例如以下的代码段:
```go
func shadow() (err error) {
x, err := check1() // x是新创建变量err是被赋值
if err != nil {
return // 正确返回err
}
if y, err := check2(x); err != nil { // y和if语句中err被创建
return // if语句中的err覆盖外面的err所以错误的返回nil
} else {
fmt.Println(y)
}
return
}
```
## 链接
- [目录](directory.md)
- 上一节:[常见的陷阱与错误](16.0.md)
- 下一节:[误用字符串](16.2.md)