易犯的五个Go编码错误

1. 使用 time.Parse()解析时间

导致获取的时间戳比真实的多 8 小时。即使设置了全局的time.Local也一样,更换成time.ParseInLocation即可,原因:

go 复制代码
 
func Parse(layout, value string) (Time, error) {
	// Optimize for RFC3339 as it accounts for over half of all representations.
	if layout == RFC3339 || layout == RFC3339Nano {
		if t, ok := parseRFC3339(value, Local); ok {
			return t, nil
		}
	}
    // 源码中写死的UTC时区
	return parse(layout, value, UTC, Local)
}

2. 不清楚 defer 参数是被立即计算的

go 复制代码
 
func Doing() error {
    var err error
    defer handlerErr(err) // handlerErr 永远得到的err是nil
    err = doSomething()
    return err
}

3. 循环中 defer

go 复制代码
 
func Doing() {
	mutex := sync.Mutex{}
	for i := 0; i < 1000000000; i++ {
		mutex.Lock()
		defer mutex.Unlock() // 死锁,因为要等方法结束后才Unlock
        // do something
	}
}

4. 未注意 net/http 中 ctx 生命周期

go 复制代码
 
package main
import (
    "context"
    "net/http"
)

func main() {
    http.HandleFunc("/createOrder", func(w http.ResponseWriter, r *http.Request) {
       ctx := r.Context()
       // 创建订单
       orderDo := createOrder(ctx, reqParams)

       // 异步推送订单到供应链
       go SubmitToSupplier(ctx, orderDo)
    })
    http.ListenAndServe(":8080", nil)
}

由于 ctx 在 socket 连接读取出错或 handleFunc 完成时会被 cancel,导致:

  1. 当浏览器或调用方的 clinet 主动关闭时,即使 createOrder 未运行完,ctx 也会收到 cancel 事件,如是里面有 DB 不在一个事务、或支持 ctx 的 IO 请求的操作,都会中断。
  2. 协程启动后,由于 handleFunc 运行结束,ctx 被 cancel,导致程序受协程方法运行受影响

5. 协程中未捕获 panic

导致主程序退出,建议统一封装启动协程方法,否则很容易忘记 recover panic

相关推荐
人间打气筒(Ada)11 小时前
go:如何实现接口限流和降级?
开发语言·中间件·go·限流·etcd·配置中心·降级
我叫黑大帅1 天前
Go 中最强大的权限控制库(Casbin)
后端·面试·go
古城小栈1 天前
Jenkins+K8s实现Go后端服务自动化部署
go·k8s·jenkins
不会写DN2 天前
Gin 实战入门:从环境搭建到企业级常用特性全解析
go·gin
下次一定x2 天前
深度解析 Kratos 客户端服务发现与负载均衡:从 Dial 入口到 gRPC 全链路落地(下篇)
后端·go
乐茵lin2 天前
大厂都在问:如何解决map的并发安全问题?三种方法让你对答如流
开发语言·go·编程·map·并发安全·底层源码·sync.map
不会写DN3 天前
GORM 实战入门:从环境搭建到企业级常用特性全解析
sql·mysql·go·gin
F1FJJ3 天前
Shield CLI 的 PostgreSQL 插件 v0.5.0 发布:数据库导出 + 协作增强,ER 图全新体验
网络·数据库·docker·postgresql·go
liangbm35 天前
AI-ViewNote:把网课和会议视频自动卷成结构化笔记
ai·typescript·go·软件构建·开源软件·react·桌面软件
我叫黑大帅5 天前
Gin 实战入门:从环境搭建到企业级常用特性全解析
后端·面试·go