猿问

为什么 conn.Read() 不向 []byte 写入任何内容

它输出方括号的原因是因为您将切片传递到打印命令中。


您要做的是将每个命令放入一个字符串中,以便根据需要进行打印。


firstname := os.Args[1]

lastname := os.Args[2]

fmt.Println(lastname + ", " + firstname)

您还应该查看Chandru 指出的字符串包。那里有很多好东西可以帮助处理字符串。


见:https : //golang.org/pkg/strings我有一个连接,创建如下:


conn, err = net.Dial("tcp", "127.0.0.1:20000")

我尝试通过两种方式从这个连接中读取。我认为他们都必须工作,但第一个选项没有。


这是第一种方法:


var bytes []byte

for i := 0; i < 4; i++ {

    conn.Read(bytes)

}

fmt.Printf("%v", bytes)

该方法的输出是:


[]

这是同样的事情,完成了bufio.Reader:


func readResponse(conn net.Conn) (response string, err error) {

    reader := bufio.NewReader(conn)

    _, err = reader.Discard(8)

    if err != nil {

        return

    }


    response, err = reader.ReadString('\n')


    return

}

该函数返回 TCP 连接另一端的服务器给出的响应。


为什么bufio.Reader.Read()有效,但net.Conn.Read()没有?


阿波罗的战车
浏览 179回答 1
1回答

慕无忌1623718

该Conn.Read()方法是为了实现io.Reader,从任何字节源读取数据的通用接口[]byte。引用自 的文档Reader.Read():Read 将最多 len(p) 个字节读入 p。因此Read()最多读取len(p)字节,但由于您传递了一个nil切片,它不会读取任何内容(nil切片的长度为0)。请阅读链接的文档以了解Reader.Read()工作原理。Reader.Read()没有分配一个缓冲区 ( []byte) 来存储读取的数据,你必须创建一个并传递它,例如:var buf = make([]byte, 100)n, err := conn.Read(buf)// n is the number of read bytes; don't forget to check err!不要忘记始终检查返回的数据,如果到达数据末尾error可能会返回io.EOF。的常规协定io.Reader.Read()还允许返回一些非nil错误(包括io.EOF)和一些读出的数据(n > 0)在同一时间。读取的字节数将在n,这意味着只有 的第一个n字节buf是有用的(换句话说:)buf[:n]。您使用的其他示例bufio.Reader有效,因为您调用了Reader.ReadString()which 不需要[]byte参数。如果您使用了该bufio.Reader.Read()方法,您还必须传递一个非nil切片才能实际获取一些数据。
随时随地看视频慕课网APP

相关分类

Go
我要回答