Go:从net.Conn获取io.ByteReader

时间:2014-02-08 06:50:04

标签: go

我使用与以下类似的Go代码连接到TCP / IP服务器:

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

现在我需要使用带有io.ByteReader的binary.ReadVariant,所以尝试编写这样的代码:

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)

我该如何做到这一点?

2 个答案:

答案 0 :(得分:10)

问题是 net.Dial 返回的基础net.TCPConn net.Conn 只实现 Read(byte[]) (int, err) 方法。这意味着返回的 net.Conn 满足 io.Reader 接口,但它不满足 io.ByteReader 接口,因为 net.TCPConn 没有 ReadByte() (c byte, err error) 方法。

您可以使用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)
}

答案 1 :(得分:4)

bufio.Reader实现了ByteReader界面。

使用conn包裹bufio.NewReader(conn)应该有效。