关于 Golang 开发中遇到的坑

写 Golang 半年多了,现在整理一下遇到的坑。

1. gorm中会自己调换条件语句的位置,在用 gorm 自带的函数功能的时候务必用 debug() 打出它最后的 sql 语句。

2. 在 range 里使用闭包,若直接在闭包里使用 for k,v := range slice{}中的v,看到的现象是读取的value总是读取循环的最后一个值,原理是在循环中创建的闭包并没有立即执行,而在闭包执行的时候value已经指到了最后一个值。正确的解决方法是在闭包外把 value 赋值给新变量,在闭包内使用新变量,或者把 v 做闭包的参数传参。

3. defer 创建时传进的参数是复制进去的,即使该变量在 defer 语句之后被修改过,在 defer 执行时,被执行的参数是当初复制的值。

4. 假设 defer 语句中修改 func 局部变量 a,而函数 return 时也使用 a 的值,那么即使 defer 语句在 return 之前执行了修改 a 值的操作,return 的结果也并不是 defer 语句中修改之后的,原因是 return 语句声明了一个独立的结果变量,即 func foo() (result int) {...} 中的 result, 它的值是由 defer 外的作为函数局部变量的 a 复制而来。

5. slice 用索引切片的时候 [m:n] m 是开始下标,而 n 并不是下标,而是用来计算取n-m个 item。

6. 在两个工厂模式的服务之间进行通信的时候,遇到了 A项目在短时间内接到了大量来自 B项目的回调,随之同时修改 A项目里的 dynamoDB 里的对象,而对象上又加了锁,导致发生了释放锁失败,加锁失败。后来把等待回调改成了主动轮训,也就避免了被动修改数据库的情况。

7. 因为没有加 WaitGroup 导致主线程意外结束的时候,并发的 goroutine 跟着结束

8. 第一次用make()创建空数组的时候,曾写成 a := make([]int, 1), 以为创建了长度为1的数组,然后往里放对象,append(1), 之后打印 a[0] ,发现是 a[0] = 0, 打印出 a 才发现成了 [0,1], 也就是说,创建的时候,已经 a 里有了一个元素, 再往里 append,写入的是 a[1]位置。所以以后 make 空数组,一律是长度 0。

8. make 和 new 的区别。从原理上来说,make 返回的是数据对象,new 返回的是数据对象的指针,从表象上来说, make 只能用于 slice, map, channel,  而 new 可以 new 一个结构体。

9. 在 go 语境中,狭义的“实现枚举”,是指一个类型,除了定义const iota ,还绑定了自己的序列化、反序列化方法,通过接口反射实现了枚举。

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值