我正在構建一個管理資料并將其寫入檔案的 go 庫。我寫了一個檔案寫入器,我可以將資料傳遞給它,它會通過緩沖寫入器將該資料寫入檔案。這意味著一旦服務關閉,使用該庫的服務將不得不呼叫 close 方法以寫入仍在緩沖區中的任何內容。我看到兩種處理方法:
- 公開
Close服務可以使用的方法。 - 使用渠道。如果服務關閉通道,那將關閉庫中的緩沖區。我的 lib 函式如下所示:
func (r *Repo) Write(ctx context.Context, data <-chan Data, errCh chan<- error) error {
for doc := range data {
err := r.file.Write(ctx, doc)
if err != nil {
errCh <- err
}
}
err = r.file.Close(ctx)
return err
}
我的問題是Write()簽名是否有意義,因為它需要一個接收通道和一個發送通道作為輸入錯誤?我還沒有看到類似的例子。也許有更好的組織方式?
uj5u.com熱心網友回復:
選項 1. ie 使用Close函式更有意義,特別是如果你看看 go 的做事方式。
當事情可以在沒有它們的情況下完成時,使用渠道也會使事情變得復雜。就像Write實作有一個 for 回圈,它不斷讀取資料。
for doc := range data {
err := r.file.Write(ctx, doc)
if err != nil {
errCh <- err
}
}
這意味著任何呼叫此寫入函式的人都會被阻塞,如果需要非阻塞行為,則需要將其呼叫到 goroutine 中。
另外有一個簡單的寫簽名,比如:
func (r *Repo) Write(data Data) error
看起來更干凈,Repo如果每次呼叫函式時都沒有改變,背景關系可以作為初始化的一部分。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/358273.html
標籤:走
