golang 学习过程中踩的坑

目录

  • [他人总结]
  • 首字母大写才是对外可见的
  • 包的初始化函数顺序问题
  • DB 连接泄漏问题
  • err 常用写法
  • goroutine 内的变量
  • 指针可能是 nil
  • 多层 map 未初始化

[他人总结]

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 包的时候就执行
执行顺序:

  1. 如果一个包的多个文件里面都有 init 函数, 按文件名排序之后的执行
  2. 同一个文件 import 了多个包, 则按照 import 的先后顺序执行
  3. 被递归 import 的包的初始化顺序与 import 顺序相反,例如:导入顺序 main –> A –> B –> C,则初始化顺序为 C –> B –> A –> main
  4. 一个包被其它多个包 import,但只能被初始化一次
  5. main 包总是被最后一个初始化
  6. 避免出现循环依赖, 例如: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 // 错误

原文地址:https://www.cnblogs.com/zlbeidou/p/10768832.html

时间: 2024-11-06 09:37:46

golang 学习过程中踩的坑的相关文章

这些年,在数据挖掘项目中踩的“坑”

数据挖掘项目是一个涉及的环节也比较多,而且高度依赖数据的项目.所以在其中一个过程中遇到点坑,简直太正常不过了.需求不明确是第一大坑.需求不明确会把后面的分析方向完全带沟沟里面去,也容易被迫接受一些不可能完成的挖掘目标和商业目标.不过这种一般只会发生在一个公司刚开始有这个岗位的时候,随着项目的增加,后面大家普遍就知道数据挖掘的极限了,也知道数据挖掘任务所存在的风险了,便不会提出不可能完成的目标了.说一个曾经被带沟沟里去的需求.有一次接到领导说做一个需求,要找出影响用户忠诚度的关键因子,然后我吭哧吭

django使用过程的中踩的坑

1.django的request参数其中 请求报文 由客户端发送,其中包含和许多的信息,而 django 将这些信息封装成了 HttpRequest 对象,该对象由 HttpRequest 类创建.每一个请求都会生成一个 HttpRequest 对象,django会将这个对象自动传递给响应的视图函数,一般视图函数约定俗成地使用 request 参数承接这个对象 简而言之就是我们可以用这个方法从前台取到各种数据,比如cookies,表单的参数等 2.django的sql操作 table.objec

java学习过程中遇到的坑及解决方法

1. Table 'my_data_base.gjp_zhangwu' doesn't exist Query: select * from gjp_zhangwu Parameters: 数据库中的表不存在 2.java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory 需要导入commons-logging jar包 原文地址:https://www.cnblogs.com/we-smile/p/968047

Ubuntu中安装FTP 服务器自己踩得坑

12点多了,擦!做个码农真不容易呀! 系统:Ubuntu16.04 安装:FTP 步骤: 1.不管有没有一上来我先卸载: sudo apt-get purge vsftpd 2.再安装:sudo apt-get install vsftpd 3.创建ftp用户: 创建用户目录 sudo mkdir /home/uftp 创建用户 sudo useradd -d /home/uftp -s /bin/bash uftp 修改密码 sudo passwd uftp#这里会提示你输入二次密码 4配置v

【Fine原创】JMeter分布式测试中踩过的那些坑

最近因为项目需要,研究了性能测试的相关内容,并且最终选用了jmeter这一轻量级开源工具.因为一直使用jmeter的GUI模式进行脚本设计,到测试执行阶段工具本身对资源的过量消耗给性能测试带来了瓶颈,一般线程加到100左右就会出现工具本身无法支撑的问题,广泛了解解决办法后,发现分布式部署测试机仍是首选方案. 关于如何配置jmeter分布式部署测试机很多博客上已经描述得很详细了,这里就不再赘述,可以参考虫师的博客: http://www.cnblogs.com/fnng/archive/2012/

phonegap开发app中踩过的那些坑

把遇到的问题列出来,如果有解决方案的,偶也会写下来,如果大家有更好解决方法的,欢迎留言噢 phonegap 2.9无法触发deviceready事件 亲们可以看下控制台有木有报错,如果有提示cordova_plugins.json 404 (Not Found) ,就在www目录下新建个空文件,命名为cordova_plugins.json就好了,cordova初始化的时候会请求这个文件,但po主还没发现这个文件有啥用,但是没有这个文件的话,cordova初始化失败,自然不会触发devicere

使用ffmpeg视频编码过程中踩的一个坑

今天说说使用ffmpeg在写视频编码程序中踩的一个坑,这个坑让我花了好多时间,回头想想,很多时候一旦思维定势真的挺难突破的.下面是不正确的编码结果: 使用ffmpeg做视频编码过程中,首先要新建数据帧,并为数据帧分配相应内存,以便于保存图像数据,为数据帧分配内存需要用到av_image_alloc()这个函数,该函数将根据传入的图像宽.高.图像格式.数据对齐基数等参数进行内存分配. 这其中有一个参数可能会让人迷惑,那就是数据对齐基数这个参数该设置多少?顺便说说为什么要数据对齐,之所以要对齐,主要

Asp.Net Core中使用Swagger,你不得不踩的坑

很久不来写blog了,换了新工作后很累,很忙.每天常态化加班到21点,偶尔还会到凌晨,加班很累,但这段时间,也确实学到了不少知识,今天这篇文章和大家分享一下:Asp.Net Core中使用Swagger,你不得不踩的坑. 这篇文章着重讲几点: swagger 跨层注释问题 swagger Get请求传多个参数的问题 swagger Enum 注释问题 swagger api文档版本控制 第一步:搭建一个webapi项目或者mvc项目,引入swagger nuget 我创建项目,习惯性的先创建一个

ng-zorro-antd中踩过的坑

ng-zorro-antd中踩过的坑 前端项目中,我们经常会使用阿里开源的组件库:ant-design,其提供的组件已经足以满足多数的需求,拿来就能直接用,十分方便,当然了,有些公司会对组件库进行二次封装,改造成极具自家风格的产品. 在本系列的文章中,不谈高大上的东西,不深究底层源码,只分享一些项目中遇到的小问题. 表格(table) --师傅以为是组件库的bug,没想到-- 不知道正在阅读本文的读者有没有经历过: 在使用 <nz-table></nz-table> 的时候,删除表