1 回答

TA貢獻1817條經驗 獲得超14個贊
Go 中的一般概念是任何實現io.Closer(具有Close()方法),當您有這樣一個您不打算再使用的值時,您應該調用它的Close()方法,該方法通常會釋放資源,否則可能不會立即釋放或不會立即釋放所有(曾經)。
您的db.QueryContext()調用sql.Conn.QueryContext()將返回一個*sql.Rows具有Close()方法的值。叫那個。目前,您甚至沒有存儲返回的sql.Rows.
像這樣做:
var rows *sql.Rows
rows, err = db.QueryContext(ctx, tempInsertQuery)
if err != nil {
fmt.Println(err)
return
}
if err2 := rows.Close(); err2 != nil {
fmt.Println("Error closing rows:", err2
}
將此應用于Conn.QueryContext().
只要有意義,就使用defer調用此類Close()方法,因此即使您的代碼出現恐慌或return在“手動”調用之前有一條語句,它也會被執行。
您的代碼中的此類示例是csvFile.Close(). 在此之前有returns,如果執行其中一個分支,csvFile則不會關閉。
像這樣做:
csvFile, err = os.Open(file)
if err != nil {
for err != nil {
fmt.Println("Encountered error in opening file.. trying again in 10 seconds.")
time.Sleep(10 * time.Second)
csvFile, err = os.Open(file)
}
fmt.Println(err)
}
defer func() {
if err2 := csvFile.Close(); err2 != nil {
fmt.Println("Error closing csvFile:", err2
}
}()
- 1 回答
- 0 關注
- 215 瀏覽
添加回答
舉報