第一種:
func read(conn *net.Conn) error { defer conn.Close() buf := make([]byte, 0, 4096) len := 0 for { n, err := conn.Read(buf[len:]) if n > 0 { len += n } if err != nil { if err != io.EOF { //Error Handler } break } } // buf[:len] is the content }
第二種,更給力的一種方法:
func read2(conn *net.Conn) error { defer conn.Close() var buf bytes.Buffer _, err := io.Copy(&buf, conn) if err != nil { // Error handler return err } return nil }
從io.Copy的實現來看,它實際上跟第一種的實現非常像。它先從conn中讀出最多32KB的數據,然后調用buf的Write方法將這些數據寫入到buf中。
第三種:
func read3(conn *net.Conn) error { defer conn.Close() buf, err = ioutil.ReadAll(conn) if err != nil { // Error Handler return err } // use buf... return nil }
要想玩得爽,還是用第一種比較靠譜。知根知底。