亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

推遲到函數之外

推遲到函數之外

Go
慕的地6264312 2022-07-04 10:01:40
我使用的一個常見模式是:resource.open()defer resource.close()有時會檢查兩者之間的錯誤,這會導致:err := resource.open()if err != nil{     //do error stuff and return}defer resource.close()有時我會連續需要多個打開/關閉資源,導致前 5 行的變化一個接一個地重復。這種變化可能會在我的代碼中逐字重復多次(我需要所有相同的資源)。將所有這些包裝在一個函數中會很棒。但是,這樣做會在函數調用結束后立即關閉資源。有沒有辦法解決這個問題 - 要么推遲到調用堆棧的“升級”或其他方式?
查看完整描述

2 回答

?
Helenr

TA貢獻1780條經驗 獲得超4個贊

一種方法是使用帶有回調的“初始化程序”函數:


func WithResources(f func(Resource1, Resource2)) {

   r1:=NewResource1()

   defer r1.Close()

   r2:=NewResource2()

   defer r2.Close()

   f(r1,r2)

}


func F() {

  WithResources(func(r1 Resource1, r2 Resource2) {

    // Use r1, r2

  })

}

函數的簽名f取決于您的確切用例。


另一種方法是對資源集使用結構:


type Resources struct {

   R1 Resource1

   R2 Resource2

   ...

}


func NewResources() *Resources {

   r:=&Resources{}

   r.R1=NewR1()

   r.R2=NewR2()

   return r

}


func (r *Resources) Close() {

   r.R1.Close()

   r.R2.Close()

}


func f() {

   r:=NewResources()

   defer r.Close()

   ...

}


查看完整回答
反對 回復 2022-07-04
?
飲歌長嘯

TA貢獻1951條經驗 獲得超3個贊

將所有這些包裝在一個函數中會很棒。

很可能很多人會討厭閱讀這樣的代碼。所以“精彩”可能是非常主觀的。

但是,這樣做會在函數調用結束后立即關閉資源。

確切地。

有沒有辦法解決 [...]?

不。


查看完整回答
反對 回復 2022-07-04
  • 2 回答
  • 0 關注
  • 106 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號