2017-07-07 37 views
1

當我嘗試從一個讀者手動作家複製,我發現這工作:從讀取器讀取並寫入Golang中的Writer時是否需要檢查非零長度?

func fromAToB(a, b net.Conn) { 
    buf := make([]byte, 1024*32) 
    for { 
     n, err := a.Read(buf) 
     if n > 0 { 
      if err != nil { 
       log.Fatal(err) 
      } 
      b.Write(buf[0:n]) 
     } 
    } 
} 

但這並不

func fromAToB(a, b net.Conn) { 
    buf := make([]byte, 1024*32) 
    for { 
     _, err := a.Read(buf) 
     if err != nil { 
      log.Fatal(err) 
     } 
     b.Write(buf) 
    } 
} 

所以問題是:

  • 爲什麼檢查if n>0是必要的?
  • 這只是net.Conn或實現Reader和Writer接口的任何類型所必需的嗎?

編輯:第二個代碼段運行正常,沒有任何運行時錯誤,只是行爲不正確。我想知道那個n>0檢查的效果是什麼,當我刪除它時表面下會發生什麼。

+1

在['io.Reader'文檔](https://golang.org/pkg/io/#Reader)中詳細解釋了這個問題。 – JimB

+0

@JimB文檔只推薦如何處理錯誤。第二個代碼片段運行正常,沒有檢查'n> 0',沒有報告運行時錯誤,但行爲很奇怪。 –

+0

是的,你可以自由地做到這一點,但文檔顯示如何處理讀取數據和錯誤,以便你得到正確的行爲。 – JimB

回答

0

已經有一個功能io.Copy來做到這一點。你可以用see how it's implemented作爲一個很好的例子。它適用於所有io.Reader/io.Writer類型。

+0

是的,我讀了'io.Copy'的來源,那就是我如何意識到我做錯了什麼。 –

0

我想到了:沒有n,它會將整個緩衝區(32 * 1024字節)寫入Writer而不是n字節,這就是奇怪行爲的根源。

相關問題