Go开发常见陷阱
Go作为一种简便灵巧的语言,深受开发者的喜爱。但对于初学者来说,要想轻松驾驭它,还得做好细节学习工作。
初学者应该注意的地方:
- 大括号不能独立成行。
- 未使用变量错误——对于全局变量和函数参数变量,是可以定义后不使用的。但是对于函数内部变量来说,如果进行定义后不进行使用,编译器会提示错误。
- 导入包未调用错误——导入包后,如果不进行调用,例如函数,接口,结构及变量等对象,那么会出现编译错误。这里建议使用空白表示符“_”来避免类似错误。
- 变量简写只适用于函数内部。
- 重新定义变量要使用简写声明——你不能在一个独立的语句中重新定义一个变量,但在复合变量场合是允许的。重新定义的变量需存在于同一区块,否则会产生一个阴影变量。
- 意外的变量——变量简写语法由于十分简便,因此很容易会把它作为一个常规的指派操作。虽然可以通过编译,但是其结果却不是我们想要的。
- 不能使用“nil”来定义一个没有类型的变量——“nil”关键字可用于表示“0值”,例如在接口,函数,指针等对象中。但如果把它用于定义一个没有进行类型声明的变量,将会导致编译错误,因为编译器无法确定变量类型。
- 使用“nil”切片(Slices)和图(Maps)——为“nil”切片添加对象是可以的,但对于图来说,这样会造成运行缓慢。
- 图容量——可以在创建时设定图的容量,但是不用对图使用cap()。
- 字符串不能为“nil”。
- 数组函数参数——对于C/C++开发者来说,数组如同指针;当把数组传入函数时,函数会引用相同的内存位置,所以能够更新原始数据。但在Go中,数组是值,因此当把数组传入函数时,得到的是原始数组数据的副本。因此如果想更新数组数据,这个造成问题。
- 切片和数组“范围(range)”里的异常——在使用for-in或foreach语句时会遇到该问题。在Go中,range的定义是有所不同的。它会产生两个值:第一个为索引项,第二个说项的数据。
- 单维度的切片和数——要创建一个动态多维度数组,要使用独立切片。首先,要创建外层切片;然后,要对每个内联切片进行分配。每个内联切片对于其它切片来说是独立的。
- 访问不存在的图键——如果想知道一个给定图记录是否存在,应该通过检查来自图访问操作的第二个值。
- 不可改变的字符串——如果想通过索引运算符来更新一个字符串变量中的独立字符是会出现错误的,由于字符串是只读的字节片。正确做法是使用一个单字节片进行操作而不是转成字符串类型进行操作。
- 字符串和字节片转换——当把字符串转换为字节片时,你得到是一份完整的原始数据。Go提供了一对[]byte to string,string to []byte的优化转换操作,以防止造成额外分配。
- 字符串和索引运算符——字符串中的索引运算符返回的是字节值而不是字符。
- 字符串不总是UTF8文本——字符串没有被限定为UTF8文本。它们可以包含任何字节。只有当使用字符串常数时才是UTF8文本。
- 字符串长度——Go中应使用RuneCountInString()函数来取得字符串长度值而不是len()函数。
- 多行切片,数组,和图定义中缺少逗号。
- log.Fatal和log.Panic:日志库提供了不同的日志级别。
- 预置数据结构运算是不同步的。
- 在range中的字符串迭代值。
- 使用for range来进行图迭代。
- Switch语句的注意事项:switch语句的case区块默认是隔断的。
- 递增和递减:Go中是不支持i++或++i的递增/减操作的。
- 按位不是运算符:很多语言使用~来作为一元逻辑非运算符,而Go中则使用^。
- 运算符优先级差异。
- 导出结构域是没有编码。
- 程序结束时没有销毁Go线程。
- 当目标接收器就绪时就发送一个缓冲区通道返回。
- 封闭通道发送的问题。
- 使用“nil”通道。
- 有值接收器的方法不能用于改变原始值。
中级开发者应该注意的地方:
- 关闭HTTP响应。
- 关闭HTTP连接。
- 结构,数组,切片和图的比较。
- 可以使用==运算符来比较不同的结构变量。
- 从异常中恢复。
- 可以使用recover()来捕获/拦截异常。
- 更新和引用切片,数组,及图“range”的项值。
- 切片的“隐藏”数据。
- 切片数据的错误。
- “变味”的切片。
- 类型声明和方法。
- for switch和for select代码块的终止。
- for语句中的迭代变量和结束。
- 延迟的函数调用参数求值。
- 延迟函数调用执行。
- 错误类型的判断。
- 断开的Go线程和资源泄漏。
高级开发者应该注意的地方:
- 对值实例使用指针接收方法。
- 更新图值域。
- “nil”接口和“nil”接口值。
- 堆栈变量。
- GOMAXPROCS,并发,并行化。
- 抢先调度。
英文来着:http://devs.cloudimmunity.com/gotchas-and-common-mistakes-in-go-golang/index.html
Go开发常见陷阱的更多相关文章
- 编译流程,C开发常见文件类型名
编译流程 我们常说的编译是一个整体的概念,是指从源程序到可执行程序的整个过程,实际上,C语言编译的过程可以进一步细分为预编译->编译->汇编->链接 预编译是把include关键字所 ...
- Java多线程编程的常见陷阱(转)
Java多线程编程的常见陷阱 2009-06-16 13:48 killme2008 blogjava 字号:T | T 本文介绍了Java多线程编程中的常见陷阱,如在构造函数中启动线程,不完全的同步 ...
- WCF分布式开发常见错误解决(1):An error occurred while attempting to find services at...添加服务引用出错
WCF分布式开发常见错误解决(1):An error occurred while attempting to find services at...添加服务引用出错 当我们在客户端添 ...
- 上海租房找房建议及条件,上海IT行业开发常见公司的位置地点
上海租房,找房条件 以2号地铁线为中心,优先选择(回家方便,重点!),交通设施较集中地铁:2,3,4 区:普陀区,静安区,长宁区,闸北区,浦东新区,闵行区,徐汇区 路:镇坪路,威宁路,娄山关路,中山公 ...
- Spring应用开发常见规范
1.Spring应用开发常见包命名规范 controller:控制器 service:服务-接口 impl:服务-实现 integration sao:调用其他模块的,把feign的调用放到这个下面 ...
- (转载)android开发常见编程错误总结
首页 › 安卓开发 › android开发 android开发常见编程错误总结 泡在网上的日子 / 文 发表于2013-09-07 13:07 第771次阅读 android,异常 0 编辑推荐:稀 ...
- Android使用WebView开发常见的坑
原文链接:http://mp.weixin.qq.com/s?__biz=MzAwODE1NTI2MQ==&tempkey=uP3a%2BOgIN7vPbLfJp3BTCl2KabYi1%2F ...
- Java避坑宝典《Java业务开发常见错误100例》上线了
写这个专栏的缘起 之前我写过一篇博客:<朱晔的互联网架构实践心得S2E2:写业务代码最容易掉的10种坑>,引起的关注还是挺多的.后来和极客时间的编辑一拍即合决定以这个为题写一个专栏.其实所 ...
- 开发常见错误解决(6)WSE3.0未处理的WebException,未处理的Web异常,基础连接以及关闭...
开发常见错误解决(6)WSE3.0未处理的WebException,未处理的Web异常,基础连接以及关闭. 我们在调试WSE服务端服务的时候会抛出,未处理的Web异常,基础连接以及关闭的异常信息.如图 ...
随机推荐
- Docker(一):什么是docker
Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Linux 基金会,遵从了 ...
- 带接口的webservice 的发布
1.接口:(打上service注解) package ws.qlq.a; import javax.jws.WebService; /** * 面向接口的webservice发布方式 * * */ @ ...
- 【Visual Studio】Visual Studio 2010 "LNK1123: 转换到 COFF 期间失败: 文件无效或损坏" 的解决方法
1.将 项目|项目属性|配置属性|连接器|清单文件|嵌入清单 “是”改为“否”. 2.找到 C:\Windows\winsxs\x86_netfx-cvtres_for_vc_and_vb_b03f5 ...
- Linux 6.x 下Oracle 11g R2 安装配置
Oracle 11g R2 数据库安装硬件配置要求: 最小内存 1 GB of RAM 虚拟内存容量,这个oracle也有要求,不用担心此时的swap分区不够oracle的要求 .虚拟内存swap如何 ...
- 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛【待补】
[链接]:https://www.nowcoder.com/acm/contest/90#question
- python接口自动化(四十)- logger 日志 - 下(超详解)
简介 按照上一篇的计划,这一篇给小伙伴们讲解一下:(1)多模块使用logging,(2)通过文件配置logging模块,(3)自己封装一个日志(logging)类.可能有的小伙伴在这里会有个疑问一个l ...
- Windows 远程桌面文件传输的方法
实现电脑的远程连接以后,很多时候会需要进行主机间的文件传输,这个时候就可以用系统自带的远程连接里的磁盘映射来完成,详细如下: 远程桌面程序内置了映射磁盘的功能,通过这个功能可以实现远程登录服务器时自动 ...
- How To Commit Just One Data Block Changes In Oracle Forms
You have an Oracle Form in which you have multiple data blocks and requirement is to commit just one ...
- cocos3.7.1 mac 创建项目
cocos2d-x-3.7/tools/cocos2d-console/bin目录下,输入命令: ./cocos.py new HelloWorldDemo -p com.coco2dx.org -l ...
- DotnetBrowser高级教程-(4)使用MVC框架1-搭建基础框架
我们这次重点介绍下MVC框架的使用. 如果您之前使用过微软的mvc web框架,那么dotnetbrowser的mvc框架相信您也会很快上手,两者之间相似度约有80%. 所谓的mvc,以一个例子为例: ...