我使用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.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)
}
Run Code Online (Sandbox Code Playgroud)