我使用与以下类似的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)
我该如何做到这一点?
答案 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)
应该有效。