golang 学习过程中踩的坑
[他人总结]
https://chai2010.cn/advanced-go-programming-book/appendix/appendix-a-trap.html
http://km.oa.com/group/16106/articles/show/304264
首字母大写才是对外可见的
需要首字母大写才是对外可见的, 这是的对外指的是不同的 package, 特别需要注意的是 json 解析时的 struct 里面的字段名首字母必须大写, 否则无法解析, 同理还有 toml 配置解析等等
包的初始化函数顺序问题
包内的 init() 函数会在 import 包的时候就执行
执行顺序:
- 如果一个包的多个文件里面都有 init 函数, 按文件名排序之后的执行
- 同一个文件 import 了多个包, 则按照 import 的先后顺序执行
- 被递归 import 的包的初始化顺序与 import 顺序相反,例如:导入顺序 main –> A –> B –> C,则初始化顺序为 C –> B –> A –> main
- 一个包被其它多个包 import,但只能被初始化一次
- main 包总是被最后一个初始化
- 避免出现循环依赖, 例如:A –> B –> C –> A
DB 连接泄漏问题
sql.Open 和 DB.Close 并不能保证连接不泄漏, database/sql 其实是连接池, Open 之后并不马上进行连接, 只有实际查询的时候才发起连接.
Query 返回的 Rows 必须 Next 每一行数据才会断开连接, 之后把连接归还到连接池, 没有读完的数据比较手动 Rows.Close 才能保证连接不泄露.
err 常用写法
// 建议都这么写:
v, err := doSth()
if err != nil {
// 出错了
...
}
// 正常的逻辑
...
// 不建议下面这样写
// 原因是 **__err==nil__** 很容易被误写成 **__err!=nil__**:
if v, err := doSth(); err == nil {
// 正常的逻辑
...
} else {
// 出错了
...
}
goroutine 内的变量
// 错误
for i:=0; i < 100; i++ {
go func() {
fmt.Println(i)
}()
}
// 正确
for i:=0; i < 100; i++ {
go func(i int) {
fmt.Println(i)
}(i)
}
// 正确
for i:=0; i < 100; i++ {
i := i
go func() {
fmt.Println(i)
}()
}
指针可能是 nil
需要注意返回指针的函数调用者一定要判断指针是否为 nil
或者写带指针返回值的函数时加一个 error 或者 bool 出参, 这样调用方不得不判断是否逻辑异常, 可以一定程度避免调用方不检查的情况
多层 map 未初始化
对未初始化的 map 取值正常, 赋值出错
var m map[int]int
if m[5] == 5 { // 正确
...
}
m[5] = 5 // 错误
m := make(map[int]map[int]int)
m[5][5] = 5 // 错误
检查除数是否可能为零
不确定的地方一定要做判断
:= 赋值声明语法糖使用不当可能踩坑
golang 学习过程中踩的坑的更多相关文章
- celery开发中踩的坑
celery开发中踩的坑 celery连接redis 当使用redis做broker,redis连接需要密码时: BROKER_URL='redis://:xxxxx@127.0.0.1:6379/0 ...
- 在kotlin用jni调用c++的dll中踩的坑
在kotlin用jni调用c++的dll中踩的坑 can't find dependents libraries 不是个有效的32位程序(或者是?????32??????) 常规检查 java 指针 ...
- 不要在PHP7中踩这些坑
PHP是当今仍然是最流行的Web开发语言,目前在所有使用服务端编程语言的网站中,超过83%的站点在使用PHP.PHP7在性能方面实现跨越式的提升,然后有些坑我们还是要提醒PHPer不要踩. 1. 不要 ...
- 使用python requests库写接口自动化测试--记录学习过程中遇到的坑(1)
一直听说python requests库对于接口自动化测试特别合适,但由于自身代码基础薄弱,一直没有实践: 这次赶上公司项目需要,同事小伙伴们一起学习写接口自动化脚本,听起来特别给力,赶紧实践一把: ...
- 需求:一个页面中需要用到多个字典数据。用于下拉选项,同时,需要将其保存为json格式。以便于key,value的相互转换。记录在实现过程中踩的坑
本文涉及到的知识: Promise,all()的使用 js处理机制 reduce的用法 map的用法 同步异步 需求: 一个页面中需要用到多个字典数据.用于下拉选项,同时,需要将其保存为json格式. ...
- java学习过程中遇到的坑及解决方法
1. Table 'my_data_base.gjp_zhangwu' doesn't exist Query: select * from gjp_zhangwu Parameters: 数据库中的 ...
- ELK系列七:Elasticsearch的集群配置和监控以及在部署ELK中踩的坑
1.基本下载安装 #按照ELK系列一博客安装启动即可,没有大坑,注意一下权限即可 chmod -R 777 ./elasticsearch #此外没有java的,注意安装下JDK,我这次部署的环境是C ...
- 项目中踩过的坑之-sessionStorage
总想写点什么,却不知道从何写起,那就从项目中踩过的坑开始吧,希望能给可能碰到相同问题的小伙伴一点帮助. 项目情景: 有一个id,要求通过当前网页打开一个新页面(不是当前页面),并把id传给打开的新页面 ...
- 【Fine原创】JMeter分布式测试中踩过的那些坑
最近因为项目需要,研究了性能测试的相关内容,并且最终选用了jmeter这一轻量级开源工具.因为一直使用jmeter的GUI模式进行脚本设计,到测试执行阶段工具本身对资源的过量消耗给性能测试带来了瓶颈, ...
随机推荐
- Go 环境配置
1.下载SDK 官网:https://golang.google.cn/ go中文在线文档:https://studygolang.com/pkgdoc 2.配置环境变量 windows使用.msi一 ...
- java核心36
1 Java平台 Java采用的是解释和编译混合的模式.它首先通过javac将源码编译成字节码文件class.然后在运行的时候通过解释器或者JIT将字节码转换成最终的机器码.只是用解释器的缺点:抛弃了 ...
- [转] 常用Loss函数
好文mark 转自机器之心 :https://www.jiqizhixin.com/articles/2018-06-21-3 “损失函数”是机器学习优化中至关重要的一部分.L1.L2损失函数相信大多 ...
- 使用fetch调用node.js的Resuful服务
在目前的软件架构中,慢慢又有这样的趋势,就是在前端和业务接口层中间再加入一层,这是由于nodejs相对JAVA而言不适合做复杂的业务逻辑,如下图: 在这样的结构中,JS前端和web层都是前端开发工程师 ...
- HTML5商城开发五 实现返回页面顶部
本文内容主要是网上参考收集,介绍四种简单的返回页面顶部代码,可以使用简单的HTML锚标记,也可使用Javascript Scroll函数动态返回等等. 一.使用锚标记返回页面顶部 使用HTML锚标记最 ...
- TCP-IP详解学习笔记2
TCP-IP详解学习笔记2 链路层 链路层的目的是为IP模块发送和接收IP数据报: TCP/IP支持多种不同的链路层,依赖于使用网络硬件类型:有线局域网(以太网,城域网(MAN),有线语音网络).无线 ...
- 【剑指offer】【python】面试题2~5
使用python实现<剑指offer>面试题ヾ(◍°∇°◍)ノ゙,以此记录. 2_实现Singleton模式 题目:实现单例模式 单例模式,是一种常用的软件设计模式.在它的核心结构中只包含 ...
- Xshell出现‘The remote SSH server rejected X11 forwarding request’解决办法
当准备用Xshell进行远程连接的时候出现下面的情况: 那么跟着我来点击鼠标就ojbk了: 文件--->属性--->隧道 然后找打 把那个单选框的对号勾掉,然后点击确认就OK了!!
- C#中用ILMerge合并DLL和exe文件成一个exe文件或者DLL
ILMerge是一个将多个.NET程序集合并到一个程序集中的实用程序.它既可以作为 开源使用,也可以作为NuGet包使用. 如果您在使用它时遇到任何问题,请与我们联系.(mbarnett _at_ ...
- delete web server(nginx+apache)
#!/bin/bash conf_dir1="/usr/local/nginx/conf/vhost.d" conf_dir2="/usr/local/apache2/c ...