2014-02-08 24 views
5

我連接到使用類似於Go代碼一個TCP/IP服務器獲取一個io.ByteReader:轉到:從net.Conn

conn, err := net.Dial("tcp", host+":"+strconv.Itoa(port)) 

現在我需要使用binary.ReadVariant這需要一個io.ByteReader,所以嘗試寫這樣的代碼:

var length int64 
var err error 
length, err = binary.ReadVarint(conn) 

讓我像一個錯誤:

./main.go:67: cannot use conn (type net.Conn) as type io.ByteReader in function argument: 
    net.Conn does not implement io.ByteReader (missing ReadByte method) 

我怎樣才能使這項工作?

回答

9

的問題是,由net.Dial返回net.Conn底層net.TCPConn僅實現Read(byte[]) (int, err)方法。這意味着,返回net.Conn滿足io.Reader接口,但由於net.TCPConn沒有ReadByte() (c byte, err error)方法不符合io.ByteReader接口。

可以使用bufio.NewReader功能來包裝net.Conn的類型確實實現了io.ByteReader接口。

實施例:

package main 

import (
    "bufio" 
    "encoding/binary" 
    "fmt" 
    "net" 
) 

func main() { 
    conn, err := net.Dial("tcp", "google.com:80") 
    if err != nil { 
     panic(err) 
    } 
    defer conn.Close() 

    fmt.Fprintf(conn, "GET/HTTP/1.0\r\n\r\n") 

    length, err := binary.ReadVarint(bufio.NewReader(conn)) 
    if err != nil { 
    panic(err) 
    } 
    fmt.Println(length) 
}