我刚开始学习围棋。当天的课程是将我的数据库处理程序包装在一个结构中以避免使用全局范围变量。到目前为止我认为我理解它并希望像我之前所做的那样推迟 Close() 方法,它以堆栈溢出结束。
我找不到解释为什么会发生这种情况,也找不到正确的方法来做到这一点。
这是关键代码:
package exporter
type DB struct {
*sqlx.DB
queriesExecuted int
}
func Open(dataSourceName string) *DB {
connection := sqlx.MustConnect("mysql", dataSourceName)
db := &DB{connection, 0}
return db
}
func (db *DB) Close() {
db.Close() // this is where the stack growth happens
}
func (db *DB) GetArticles() []oxarticle {
...
}
package main
func main() {
exporter := feedexporter.Open("root:pass@/feedexport")
defer exporter.Close()
articles := exporter.GetArticles()
}
没有 defer exporter.Close() 一切正常,包括它以:
运行时:goroutine 堆栈超过 1000000000 字节的限制
致命错误:堆栈溢出
不关闭连接感觉很糟糕;) 处理这个问题的正确方法是什么?
慕丝7291255
相关分类