2014-02-07 39 views
2

是否有可能defer到外部函數的結束?Golang推遲對來電/外部功能進行操作?

// normal transaction 
func dbStuff(){ 
    db.Begin() 
    ... 
    db.Commit() 
} 

// normal transaction w/ defer 
func dbStuff(){ 
    db.Begin() 
    defer db.Commit() 
    ... 
} 

這可能嗎?

// can you defer to caller/outer function? 
func dbStuff(){ 
    db.Trans() 
    ... 
} 

// will Commit() when dbStuff() returns 
func (db Db) Trans(){ 
    db.Begin() 
    defer db.Commit() // to caller/outer function 
} 

回答

5

根據該規範,它無法可能:

A「推遲」語句調用其執行推遲到周圍的函數返回時刻的功能,要麼是因爲周圍的函數執行一個return語句,到達函數體的結尾,或者因爲相應的goroutine正在恐慌。

(重點煤礦)

更新:除此之外,它不會是一個好主意,要麼 - 圍棋的優勢之一是「你所看到的就是你得到的」。將函數從內部函數推遲到外部函數會在控制流中產生'不可見'的變化。