真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么在Golang中處理重復(fù)錯誤

這篇文章將為大家詳細(xì)講解有關(guān)怎么在Golang中處理重復(fù)錯誤,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

專注于為中小企業(yè)提供成都網(wǎng)站制作、成都做網(wǎng)站服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)祁陽免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上千企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。

_, err = fd.Write(p0[a:b])
if err != nil {
 return err
}
_, err = fd.Write(p1[c:d])
if err != nil {
 return err
}
_, err = fd.Write(p2[e:f])
if err != nil {
 return err
}

如上代碼乍一看無法直觀的看出其本來的意圖是什么,改進版:

type errWriter struct {
 w io.Writer
 err error
}

func (ew *errWriter) write(buf []byte) {
 if ew.err != nil {
 return
 }
 _, ew.err = ew.w.Write(buf)
}

ew := &errWriter{w: fd}
ew.write(p0[a:b])
ew.write(p1[c:d])
ew.write(p2[e:f])
if ew.err != nil {
 return ew.err
}

通過自定義類型 errWriter 來封裝 io.Writer,并且封裝了 error,新類型有一個 write 方法,不過其方法簽名并沒有返回 error,而是在方法內(nèi)部判斷一旦有問題就立刻返回,有了這些準(zhǔn)備工作,我們就可以把原本穿插在業(yè)務(wù)邏輯中間的錯誤判斷提出來放到最后來統(tǒng)一調(diào)用,從而在視覺上保證讓人可以直觀的看出代碼本來的意圖是什么。

讓我們再看看 Eliminate error handling by eliminating errors 中提到的另一個 io.Writer 例子:

type Header struct {
 Key, Value string
}

type Status struct {
 Code int
 Reason string
}

func WriteResponse(w io.Writer, st Status, headers []Header, body io.Reader) error {
 _, err := fmt.Fprintf(w, "HTTP/1.1 %d %s\r\n", st.Code, st.Reason)
 if err != nil {
 return err
 }

 for _, h := range headers {
 _, err := fmt.Fprintf(w, "%s: %s\r\n", h.Key, h.Value)
 if err != nil {
 return err
 }
 }

 if _, err := fmt.Fprint(w, "\r\n"); err != nil {
 return err
 }

 _, err = io.Copy(w, body)
 return err
}

第一感覺既然錯誤是 fmt.Fprint 和 io.Copy 返回的,是不是我們要重新封裝一下它們?實際上真正的源頭是它們的參數(shù) io.Writer,因為直接調(diào)用 io.Writer 的 Writer 方法的話,方法簽名中有返回值 error,所以每一步 fmt.Fprint 和 io.Copy 操作都不得不進行重復(fù)的錯誤處理,看上去是壞味道,改進版:

type errWriter struct {
 io.Writer
 err error
}

func (e *errWriter) Write(buf []byte) (int, error) {
 if e.err != nil {
 return 0, e.err
 }

 var n int
 n, e.err = e.Writer.Write(buf)
 return n, nil
}

func WriteResponse(w io.Writer, st Status, headers []Header, body io.Reader) error {
 ew := &errWriter{Writer: w}
 fmt.Fprintf(ew, "HTTP/1.1 %d %s\r\n", st.Code, st.Reason)

 for _, h := range headers {
 fmt.Fprintf(ew, "%s: %s\r\n", h.Key, h.Value)
 }

 fmt.Fprint(ew, "\r\n")
 io.Copy(ew, body)

 return ew.err
}

通過自定義類型 errWriter 來封裝 io.Writer,并且封裝了 error,同時重寫了 Writer 方法,雖然方法簽名中仍然有返回值 error,但是我們單獨保存了一份 error,并且在方法內(nèi)部判斷一旦有問題就立刻返回,有了這些準(zhǔn)備工作,新版的 WriteResponse 不再有重復(fù)的錯誤判斷,只需要在最后檢查一下 error 即可。

類似的做法在 Golang 標(biāo)準(zhǔn)庫中屢見不鮮,讓我們繼續(xù)看看 Eliminate error handling by eliminating errors 中提到的一個關(guān)于 bufio.Reader 和 bufio.Scanner 的例子:

func CountLines(r io.Reader) (int, error) {
 var (
 br = bufio.NewReader(r)
 lines int
 err error
 )

 for {
 _, err = br.ReadString('\n')
 lines++
 if err != nil {
 break
 }
 }

 if err != io.EOF {
 return 0, err
 }

 return lines, nil
}

我們構(gòu)造一個 bufio.Reader,然后在一個循環(huán)中調(diào)用 ReadString 方法,如果讀到文件結(jié)尾,那么 ReadString 會返回一個錯誤(io.EOF),為了判斷此類情況,我們不得不在每次循環(huán)時判斷「if err != nil」,看上去這是壞味道,改進版:

func CountLines(r io.Reader) (int, error) {
 sc := bufio.NewScanner(r)
 lines := 0

 for sc.Scan() {
 lines++
 }

 return lines, sc.Err()
}

實際上,和 bufio.Reader 相比,bufio.Scanner 是一個更高階的類型,換句話簡單點來說的話,相當(dāng)于是 bufio.Scanner 抽象了 bufio.Reader,通過把低階的 bufio.Reader 換成高階的 bufio.Scanner,循環(huán)中不再需要判斷「if err != nil」,因為 Scan 方法簽名不再返回 error,而是返回 bool,當(dāng)在循環(huán)里讀到了文件結(jié)尾的時候,循環(huán)直接結(jié)束,如此一來,我們就可以統(tǒng)一在最后調(diào)用 Err 方法來判斷成功還是失敗,看看 Scanner 的定義:

type Scanner struct {
 r   io.Reader // The reader provided by the client.
 split  SplitFunc // The function to split the tokens.
 maxTokenSize int  // Maximum size of a token; modified by tests.
 token  []byte // Last token returned by split.
 buf   []byte // Buffer used as argument to split.
 start  int  // First non-processed byte in buf.
 end   int  // End of data in buf.
 err   error  // Sticky error.
 empties  int  // Count of successive empty tokens.
 scanCalled bool  // Scan has been called; buffer is in use.
 done   bool  // Scan has finished.
}

golang適合做什么

golang可以做服務(wù)器端開發(fā),但golang很適合做日志處理、數(shù)據(jù)打包、虛擬機處理、數(shù)據(jù)庫代理等工作。在網(wǎng)絡(luò)編程方面,它還廣泛應(yīng)用于web應(yīng)用、API應(yīng)用等領(lǐng)域。

關(guān)于怎么在Golang中處理重復(fù)錯誤就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。


分享名稱:怎么在Golang中處理重復(fù)錯誤
新聞來源:http://weahome.cn/article/gpgjch.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部