第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

推遲到函數(shù)之外

推遲到函數(shù)之外

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

2 回答

?
Helenr

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超4個(gè)贊

一種方法是使用帶有回調(diào)的“初始化程序”函數(shù):


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

  })

}

函數(shù)的簽名f取決于您的確切用例。


另一種方法是對(duì)資源集使用結(jié)構(gòu):


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()

   ...

}


查看完整回答
反對(duì) 回復(fù) 2022-07-04
?
飲歌長(zhǎng)嘯

TA貢獻(xiàn)1951條經(jīng)驗(yàn) 獲得超3個(gè)贊

將所有這些包裝在一個(gè)函數(shù)中會(huì)很棒。

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

但是,這樣做會(huì)在函數(shù)調(diào)用結(jié)束后立即關(guān)閉資源。

確切地。

有沒(méi)有辦法解決 [...]?

不。


查看完整回答
反對(duì) 回復(fù) 2022-07-04
  • 2 回答
  • 0 關(guān)注
  • 100 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)