Go:从net.Conn获取io.ByteReader

max*_*uin 6 go

我使用Go代码连接到TCP/IP服务器,类似于:

conn, err := net.Dial("tcp", host+":"+strconv.Itoa(port))
Run Code Online (Sandbox Code Playgroud)

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

var length int64
var err error
length, err = binary.ReadVarint(conn)
Run Code Online (Sandbox Code Playgroud)

给我一个错误,如:

./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)
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

小智 10

问题是net.Dial返回的底层net.TCPConnnet.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)
}
Run Code Online (Sandbox Code Playgroud)