从net.Conn获取一个io.ByteReader。

huangapple go评论68阅读模式
英文:

Get an io.ByteReader from a net.Conn

问题

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

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

现在我需要使用binary.ReadVarint,它需要一个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)

我该如何解决这个问题?

英文:

I am connecting to a TCP/IP server using Go code similar to:

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

Now I need to use binary.ReadVariant which takes an io.ByteReader, so trying to write code like this:

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

Gives me an error like:

./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)

How can I make this work?

答案1

得分: 10

问题是,由net.Dial作为net.Conn返回的底层net.TCPConn仅实现了*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)
}
英文:

The problem is that the underlying net.TCPConn returned by net.Dial as net.Conn only implements the Read(byte[]) (int, err) method. This means that the returned net.Conn satisfies the io.Reader interface, but it does not satisfy the io.ByteReader interface because net.TCPConn doesn't have a ReadByte() (c byte, err error) method.

You can use the bufio.NewReader function to wrap the net.Conn in a type that does implement the io.ByteReader interface.

Example:

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)
}

答案2

得分: 4

bufio.Reader 实现了 ByteReader 接口。

使用 bufio.NewReader(conn) 包装 conn 应该可以工作。

英文:

bufio.Reader implements the ByteReader interface.

Wrapping conn using bufio.NewReader(conn) should work.

huangapple
  • 本文由 发表于 2014年2月8日 14:50:03
  • 转载请务必保留本文链接:https://go.coder-hub.com/21642991.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定