Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to discard any incoming data in a connection in Go?

Tags:

go

I’m sending a request to a remote server, but don’t care about its response. I don’t want to close the connection directly because the server gets a Broken pipe error if I do that.

I currently loop on Read() calls with a buffer:

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

// ...

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

But I’m looking for something like >/dev/null in Bash. I’ve found ioutils.Discard, but it’s an io.Writer and con.Read only works on a []byte buffer.

Is there a more efficient way than just reading in a buffer like what I’m currently doing?

like image 781
bfontaine Avatar asked Jul 11 '14 21:07

bfontaine


2 Answers

you have to use ioutil.Discard like this

io.Copy(ioutil.Discard, con)

io.Copy copies from a src io.Reader to a io.Writer

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

io.Reader is an interface defined as

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

io.Writer

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

net.Conn implements io.Reader and ioutil.Discard implements io.Writer

like image 168
fabrizioM Avatar answered Nov 16 '22 09:11

fabrizioM


Since Go 1.16 (Feb 2021), programs should be using io.Discard:

package main

import (
   "fmt"
   "io"
)

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

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

like image 6
Zombo Avatar answered Nov 16 '22 08:11

Zombo