如何丢弃Go中连接中的任何传入数据?

时间:2014-07-11 21:47:17

标签: go

我正在向远程服务器发送请求,但不关心其响应。我不想直接关闭连接,因为如果我这样做,服务器会出现Broken pipe错误。

我目前使用缓冲区循环Read()调用:

con, _ := net.Dial("tcp", host)

// ...

data := make([]byte, 512)
for {
    if _, err = con.Read(data); err == io.EOF {
        break
    }
}

但我正在寻找像Bash中>/dev/null这样的东西。我找到了ioutils.Discard,但这只是io.Writercon.Read仅适用于[]byte缓冲区。

是否有一种更有效的方式,而不仅仅是像我目前正在做的那样读取缓冲区?

2 个答案:

答案 0 :(得分:11)

你必须像这样使用ioutil.Discard

io.Copy(ioutil.Discard, con)

io.Copy从src io.Reader复制到io.Writer

func Copy(dst Writer, src Reader) (written int64, err error)

io.Reader 是一个定义为

的接口
type Reader interface {
        Read(p []byte) (n int, err error)
}

io.Writer

type Writer interface {
        Write(p []byte) (n int, err error)
}

net.Conn实施io.Readerioutil.Discard实施io.Writer

答案 1 :(得分:1)

自 Go 1.16(2021 年 2 月)起,程序应使用 io.Discard

package main

import (
   "fmt"
   "io"
)

func main() {
   fmt.Fprint(io.Discard, "hello world")
}

https://golang.org/pkg/io#Discard