它输出方括号的原因是因为您将切片传递到打印命令中。您要做的是将每个命令放入一个字符串中,以便根据需要进行打印。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 []bytefor 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()没有?
1 回答
慕无忌1623718
TA贡献1744条经验 获得超4个赞
该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切片才能实际获取一些数据。
- 1 回答
- 0 关注
- 178 浏览
添加回答
举报
0/150
提交
取消