# 第16章：常见的陷阱与错误

在之前的内容中，有时候使用`!!...!!`标记警告go语言中的一些错误使用方式。当你在编程时候遇到的一个困难，可以确定本书特定的章节能找到类似的主题。为了方便起见，这里列出了一些常见陷进，以便于你能发现更多的解释和例子：

* 永远不要使用形如 `var p*a` 声明变量，这会混淆指针声明和乘法运算（参考[4.9小节](https://ryanyang.gitbook.io/the-way-to-go-zh-cn/di-er-bu-fen-yu-yan-de-he-xin-jie-gou-yu-ji-shu/di-4-zhang-ji-ben-jie-gou-he-ji-ben-shu-ju-lei-xing/04.9)）
* 永远不要在`for`循环自身中改变计数器变量（参考[5.4小节](https://ryanyang.gitbook.io/the-way-to-go-zh-cn/di-er-bu-fen-yu-yan-de-he-xin-jie-gou-yu-ji-shu/05.0/05.4)）
* 永远不要在`for-range`循环中使用一个值去改变自身的值（参考[5.4.4小节](https://ryanyang.gitbook.io/the-way-to-go-zh-cn/di-er-bu-fen-yu-yan-de-he-xin-jie-gou-yu-ji-shu/05.0/05.4)）
* 永远不要将`goto`和前置标签一起使用（参考[5.6小节](https://ryanyang.gitbook.io/the-way-to-go-zh-cn/di-er-bu-fen-yu-yan-de-he-xin-jie-gou-yu-ji-shu/05.0/05.6)）
* 永远不要忘记在函数名（参考[第6章](https://ryanyang.gitbook.io/the-way-to-go-zh-cn/di-er-bu-fen-yu-yan-de-he-xin-jie-gou-yu-ji-shu/06.0)）后加括号()，尤其调用一个对象的方法或者使用匿名函数启动一个协程时
* 永远不要使用`new()`一个map，一直使用make（参考[第8章](https://ryanyang.gitbook.io/the-way-to-go-zh-cn/di-er-bu-fen-yu-yan-de-he-xin-jie-gou-yu-ji-shu/08.0)）
* 当为一个类型定义一个String()方法时，不要使用`fmt.Print`或者类似的代码（参考[10.7小节](https://ryanyang.gitbook.io/the-way-to-go-zh-cn/di-er-bu-fen-yu-yan-de-he-xin-jie-gou-yu-ji-shu/10.0/10.7)）
* 永远不要忘记当终止缓存写入时，使用`Flush`函数（参考[12.2.3小节](https://ryanyang.gitbook.io/the-way-to-go-zh-cn/di-san-bu-fen-go-gao-ji-bian-cheng/12.0/12.2)）
* 永远不要忽略错误提示，忽略错误会导致程序奔溃（参考[13.1小节](https://ryanyang.gitbook.io/the-way-to-go-zh-cn/di-san-bu-fen-go-gao-ji-bian-cheng/13.0/13.1)）
* 不要使用全局变量或者共享内存，这会使并发执行的代码变得不安全（参考[14.1小节](https://ryanyang.gitbook.io/the-way-to-go-zh-cn/di-san-bu-fen-go-gao-ji-bian-cheng/14.0/14.1)）
* `println`函数仅仅是用于调试的目的

最佳实践：对比以下使用方式：

* 使用正确的方式初始化一个元素是切片的映射，例如`map[type]slice`（参考[8.1.3小节](https://ryanyang.gitbook.io/the-way-to-go-zh-cn/di-er-bu-fen-yu-yan-de-he-xin-jie-gou-yu-ji-shu/08.0/08.1)）
* 一直使用逗号，ok或者checked形式作为类型断言（参考[11.3小节](https://ryanyang.gitbook.io/the-way-to-go-zh-cn/di-er-bu-fen-yu-yan-de-he-xin-jie-gou-yu-ji-shu/11.0/11.3)）
* 使用一个工厂函数创建并初始化自己定义类型（参考[10.2小节](https://ryanyang.gitbook.io/the-way-to-go-zh-cn/di-er-bu-fen-yu-yan-de-he-xin-jie-gou-yu-ji-shu/10.0/10.2)-[18.4小节](https://ryanyang.gitbook.io/the-way-to-go-zh-cn/di-si-bu-fen-shi-ji-ying-yong/18.0/18.4)）
* 仅当一个结构体的方法想改变结构体时，使用结构体指针作为方法的接受者，否则使用一个结构体值类型[10.6.3小节](https://ryanyang.gitbook.io/the-way-to-go-zh-cn/di-er-bu-fen-yu-yan-de-he-xin-jie-gou-yu-ji-shu/10.0/10.6)

本章主要汇总了go语言使用过程中最常见的错误和注意事项。在之前的章节已经涉及到了完整的示例和解释，你应该做的不仅仅是阅读这段的标题。

## 链接

* [目录](https://github.com/yangchuansheng/the-way-to-go_ZH_CN/tree/f30ab7d8c58f85840a0afb548024b93642b518d5/eBook/directory.md)
* 上一章：[使用SMTP（简单邮件传输协议）发送邮件](https://github.com/yangchuansheng/the-way-to-go_ZH_CN/tree/f30ab7d8c58f85840a0afb548024b93642b518d5/eBook/15.12.md)
* 下一节：[误用短声明导致变量覆盖](https://ryanyang.gitbook.io/the-way-to-go-zh-cn/di-si-bu-fen-shi-ji-ying-yong/16.0/16.1)
