<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>go.dev</title>
  <subtitle>Browse aymeric&#39;s, an independent, searchable archive of readable snapshots from followed feeds, preserved in Git with aggr.</subtitle>
  <id>https://aggr.aymericbeaumet.com/sources/go.dev/</id>
  <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/sources/go.dev/"/>
  <link rel="self" type="application/atom+xml" href="https://aggr.aymericbeaumet.com/sources/go.dev/atom.xml"/>
  <updated>2026-10-14T16:29:33+00:00</updated>
  <author>
    <name>aymeric&#39;s</name>
  </author>
  <generator version="2.0.0" uri="https://github.com/aymericbeaumet/aggr">aggr</generator>
  <entry>
    <id>urn:aggr:item:a92034bcf73cedc8864065531000ab3fb0bdc845</id>
    <title type="text">Better HTTP/1 connection reuse in Go 1.27</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/hnrss-org/2026-10-14-better-http-1-connection-reuse-in-go-1-27/"/>
    <link rel="via" type="text/html" href="https://go.dev/blog/http-connection-reuse"/>
    <published>2026-10-14T16:29:33+00:00</published>
    <updated>2026-10-14T16:29:33+00:00</updated>
    <author>
      <name>allddd</name>
    </author>
    <category term="news"/>
    <source>
      <title>Hacker News: Front Page</title>
    </source>
    <summary type="text">Take a look at the following function: func getStatus(url string) (int, error) { resp, err := http.Get(url) if err != nil { return 0, err } defer resp.Body.Close() return resp.StatusCode, nil } It sends a GET request to url and returns the…</summary>
    <content type="html">&lt;p&gt;Take a look at the following function:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;code-snippet&quot; data-language=&quot;Go&quot;&gt;&lt;span class=&quot;syntax-source syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-declaration syntax-go&quot;&gt;&lt;span class=&quot;syntax-storage syntax-type syntax-go&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;syntax-entity syntax-name syntax-function syntax-go&quot;&gt;getStatus&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-variable syntax-parameter syntax-go&quot;&gt;url&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt; &lt;span class=&quot;syntax-storage syntax-type syntax-go&quot;&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt; &lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-return-type syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-return-type syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-storage syntax-type syntax-go&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-separator syntax-go&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;syntax-storage syntax-type syntax-go&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt; &lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;
    &lt;span class=&quot;syntax-meta syntax-initialization syntax-short syntax-go&quot;&gt;&lt;span class=&quot;syntax-variable syntax-other syntax-go&quot;&gt;resp&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-separator syntax-go&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;syntax-variable syntax-other syntax-go&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;syntax-keyword syntax-operator syntax-initialize syntax-go&quot;&gt;:=&lt;/span&gt;&lt;/span&gt; http&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-function syntax-go&quot;&gt;Get&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;syntax-keyword syntax-control syntax-go&quot;&gt;if&lt;/span&gt; err &lt;span class=&quot;syntax-keyword syntax-operator syntax-go&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;syntax-constant syntax-language syntax-go&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;syntax-keyword syntax-control syntax-go&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-go&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-separator syntax-go&quot;&gt;,&lt;/span&gt; err
    &lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-end syntax-go&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;syntax-keyword syntax-control syntax-go&quot;&gt;defer&lt;/span&gt; resp&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-other syntax-member syntax-go&quot;&gt;Body&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-function syntax-go&quot;&gt;Close&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;syntax-keyword syntax-control syntax-go&quot;&gt;return&lt;/span&gt; resp&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-other syntax-member syntax-go&quot;&gt;StatusCode&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-separator syntax-go&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;syntax-constant syntax-language syntax-go&quot;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-end syntax-go&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It sends a &lt;code&gt;GET&lt;/code&gt; request to &lt;code&gt;url&lt;/code&gt; and returns the HTTP status code.&lt;/p&gt;
&lt;p&gt;Using HTTP/1 (&lt;code&gt;GODEBUG=http2client=0&lt;/code&gt;), calling this function 100 times against &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://index.golang.org&quot;&gt;index.golang.org&lt;/a&gt; takes ~710 milliseconds on Go 1.26 on my machine. On Go 1.27, the same program takes ~150 milliseconds.&lt;/p&gt;
&lt;p&gt;That is almost 5 times faster! How is such a drastic performance difference possible?&lt;/p&gt;
&lt;h2&gt;The cost of establishing HTTP connections&lt;/h2&gt;
&lt;p&gt;To understand the difference, consider what happens on the network when we make an HTTP request.&lt;/p&gt;
&lt;p&gt;Go’s &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://go.dev/pkg/net/http&quot;&gt;&lt;code&gt;net/http&lt;/code&gt;&lt;/a&gt; package supports HTTP/1.0, HTTP/1.1, and HTTP/2. All three run over TCP, and usually over TLS when talking to HTTPS endpoints. Making a request over a new connection looks something like this:&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://go.dev/blog/http-connection-reuse/http-cost.svg&quot; alt=&quot;&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;high&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;TCP handshake (1 RTT)&lt;/strong&gt;: the client sends a &lt;code&gt;SYN&lt;/code&gt; packet, the server replies with &lt;code&gt;SYN-ACK&lt;/code&gt;, and the client replies with &lt;code&gt;ACK&lt;/code&gt;. Because the client can send the first TLS message alongside that final &lt;code&gt;ACK&lt;/code&gt;, establishing the TCP connection takes 1 round-trip time (RTT).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TLS handshake (2 RTT)&lt;/strong&gt;: next, a TLS handshake exchanges encryption keys and verifies the server’s identity; using TLS 1.2, this takes 2 RTT.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP request&lt;/strong&gt;: with the keys exchanged, HTTP requests can finally be sent after a total of 3 RTT.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These round trips (plus some CPU time spent on TLS handshakes) add up quickly. In cross-region communications, one-way latencies often reach or exceed the 50 ms (100 ms RTT) shown in the diagram above. Compared to the 300 ms spent just setting up the connection, the HTTP request itself can be cheap to serve, taking only a little over 1 RTT when bandwidth is plentiful or the HTTP response is small.&lt;/p&gt;
&lt;p&gt;Even in more favorable conditions, opening a new connection can still be expensive. Our opening benchmark queries &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://index.golang.org&quot;&gt;index.golang.org&lt;/a&gt;, which is distributed worldwide and supports TLS 1.3. This means that latency is relatively low, and the TLS handshake can actually finish in just 1 RTT. Even so, the performance difference is still very noticeable.&lt;/p&gt;
&lt;h2&gt;Connection reuse&lt;/h2&gt;
&lt;p&gt;To avoid paying this setup cost on every request, HTTP clients and servers try to reuse existing connections across multiple requests when possible. The mechanics of this differ based on the HTTP version:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HTTP/1.0&lt;/strong&gt;: while not part of the official specification, clients and servers often opt into connection reuse by sending a &lt;code&gt;Connection: keep-alive&lt;/code&gt; header. Reuse continues until either endpoint omits the header or sends a &lt;code&gt;Connection: close&lt;/code&gt; header.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP/1.1&lt;/strong&gt;: connections are persistent by default, and can be reused for subsequent requests and responses unless either side declares otherwise by sending a &lt;code&gt;Connection: close&lt;/code&gt; header.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP/2&lt;/strong&gt;: multiple requests and responses can be multiplexed over a single TCP connection.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;When connection reuse fails&lt;/h2&gt;
&lt;p&gt;In HTTP/1 (both HTTP/1.0 and HTTP/1.1), multiple requests and responses on the same connection are sent sequentially on the wire. If two &lt;code&gt;GET&lt;/code&gt; requests are sent to &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://index.golang.org&quot;&gt;index.golang.org&lt;/a&gt; over the same TCP connection, the responses arrive as a single stream of bytes:&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://go.dev/blog/http-connection-reuse/http-framing.svg&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;low&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;As shown in the diagram, &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://go.dev/pkg/net/http#Get&quot;&gt;&lt;code&gt;net/http.Get&lt;/code&gt;&lt;/a&gt; reads and parses the status line and headers from the byte stream to populate &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://go.dev/pkg/net/http#Response&quot;&gt;&lt;code&gt;net/http.Response&lt;/code&gt;&lt;/a&gt;, then returns immediately. The response body remains unread on the connection and is consumed only as the caller reads from &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://go.dev/pkg/net/http#Response.Body&quot;&gt;&lt;code&gt;net/http.Response.Body&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Because responses are sent back-to-back on the same stream, &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://go.dev/pkg/net/http&quot;&gt;&lt;code&gt;net/http&lt;/code&gt;&lt;/a&gt; can only find the start of the next response after the current response body has been read to the very end (as determined by the &lt;code&gt;Content-Length&lt;/code&gt; or &lt;code&gt;Transfer-Encoding&lt;/code&gt; header).&lt;/p&gt;
&lt;p&gt;Now look back at our example program, where we never read &lt;code&gt;resp.Body&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;code-snippet&quot; data-language=&quot;Go&quot;&gt;&lt;span class=&quot;syntax-source syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-declaration syntax-go&quot;&gt;&lt;span class=&quot;syntax-storage syntax-type syntax-go&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;syntax-entity syntax-name syntax-function syntax-go&quot;&gt;getStatus&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-variable syntax-parameter syntax-go&quot;&gt;url&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt; &lt;span class=&quot;syntax-storage syntax-type syntax-go&quot;&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt; &lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-return-type syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-return-type syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-storage syntax-type syntax-go&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-separator syntax-go&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;syntax-storage syntax-type syntax-go&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt; &lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;
    &lt;span class=&quot;syntax-meta syntax-initialization syntax-short syntax-go&quot;&gt;&lt;span class=&quot;syntax-variable syntax-other syntax-go&quot;&gt;resp&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-separator syntax-go&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;syntax-variable syntax-other syntax-go&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;syntax-keyword syntax-operator syntax-initialize syntax-go&quot;&gt;:=&lt;/span&gt;&lt;/span&gt; http&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-function syntax-go&quot;&gt;Get&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;syntax-keyword syntax-control syntax-go&quot;&gt;if&lt;/span&gt; err &lt;span class=&quot;syntax-keyword syntax-operator syntax-go&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;syntax-constant syntax-language syntax-go&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;syntax-keyword syntax-control syntax-go&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-go&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-separator syntax-go&quot;&gt;,&lt;/span&gt; err
    &lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-end syntax-go&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;syntax-keyword syntax-control syntax-go&quot;&gt;defer&lt;/span&gt; resp&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-other syntax-member syntax-go&quot;&gt;Body&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-function syntax-go&quot;&gt;Close&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;syntax-keyword syntax-control syntax-go&quot;&gt;return&lt;/span&gt; resp&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-other syntax-member syntax-go&quot;&gt;StatusCode&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-separator syntax-go&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;syntax-constant syntax-language syntax-go&quot;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-end syntax-go&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Through Go 1.26, when &lt;code&gt;resp.Body.Close&lt;/code&gt; is called, &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://go.dev/pkg/net/http&quot;&gt;&lt;code&gt;net/http&lt;/code&gt;&lt;/a&gt; sees that there is still an unread response body. Realizing that it cannot reuse the connection, it abandons the existing connection and creates new connections for its next requests, causing it to repeatedly incur the cost of establishing new connections.&lt;/p&gt;
&lt;p&gt;(HTTP/2 does not have this problem. Because it multiplexes streams of frames over a single connection rather than sending responses strictly back-to-back, an unread response body on one stream does not block other requests from sharing the connection.)&lt;/p&gt;
&lt;h2&gt;Where failed connection reuse hurts&lt;/h2&gt;
&lt;p&gt;This subtlety of HTTP/1 connection reuse can cause silent performance degradation in seemingly innocuous code.&lt;/p&gt;
&lt;p&gt;As in our opening example, a client might only care about an API response’s status code. However, the API endpoint it is talking to might send bodies that provide more detailed but ultimately unused information, such as &lt;code&gt;{&amp;quot;success&amp;quot;: true, &amp;quot;message&amp;quot;: &amp;quot;update processed&amp;quot;}&lt;/code&gt;. This will unfortunately cause connection reuse to fail.&lt;/p&gt;
&lt;p&gt;Even programs that do read the response body can run into this issue if they stop just short of the end of the body. For example, &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://go.dev/pkg/encoding/json#Decoder&quot;&gt;&lt;code&gt;encoding/json.Decoder&lt;/code&gt;&lt;/a&gt; stops reading as soon as it sees the closing &lt;code&gt;}&lt;/code&gt; of a JSON object. If a server sends a JSON response terminated with a newline, decoding the JSON object will leave the newline still unread. The connection cannot be reused for a new request until that newline is consumed. Thus, a healthy connection might end up being abandoned, even though it was only a single byte away from being reusable.&lt;/p&gt;
&lt;h2&gt;The manual solution&lt;/h2&gt;
&lt;p&gt;The unread body problem has been a long-standing sharp edge. Over the years, many Go developers came up with their own workarounds. Most commonly, this is done by draining the response body prior to closing it:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;code-snippet&quot; data-language=&quot;Go&quot;&gt;&lt;span class=&quot;syntax-source syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-declaration syntax-go&quot;&gt;&lt;span class=&quot;syntax-storage syntax-type syntax-go&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;syntax-entity syntax-name syntax-function syntax-go&quot;&gt;getStatus&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-variable syntax-parameter syntax-go&quot;&gt;url&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt; &lt;span class=&quot;syntax-storage syntax-type syntax-go&quot;&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt; &lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-return-type syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-return-type syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-storage syntax-type syntax-go&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-separator syntax-go&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;syntax-storage syntax-type syntax-go&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt; &lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;
    &lt;span class=&quot;syntax-meta syntax-initialization syntax-short syntax-go&quot;&gt;&lt;span class=&quot;syntax-variable syntax-other syntax-go&quot;&gt;resp&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-separator syntax-go&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;syntax-variable syntax-other syntax-go&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;syntax-keyword syntax-operator syntax-initialize syntax-go&quot;&gt;:=&lt;/span&gt;&lt;/span&gt; http&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-function syntax-go&quot;&gt;Get&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;syntax-keyword syntax-control syntax-go&quot;&gt;if&lt;/span&gt; err &lt;span class=&quot;syntax-keyword syntax-operator syntax-go&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;syntax-constant syntax-language syntax-go&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;syntax-keyword syntax-control syntax-go&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-go&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-separator syntax-go&quot;&gt;,&lt;/span&gt; err
    &lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-end syntax-go&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;syntax-meta syntax-function-call syntax-go&quot;&gt;&lt;span class=&quot;syntax-variable syntax-function syntax-go&quot;&gt;drainAndCloseBody&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;resp&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-other syntax-member syntax-go&quot;&gt;Body&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;syntax-keyword syntax-control syntax-go&quot;&gt;return&lt;/span&gt; resp&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-other syntax-member syntax-go&quot;&gt;StatusCode&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-separator syntax-go&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;syntax-constant syntax-language syntax-go&quot;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-end syntax-go&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;syntax-meta syntax-function syntax-declaration syntax-go&quot;&gt;&lt;span class=&quot;syntax-storage syntax-type syntax-go&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;syntax-entity syntax-name syntax-function syntax-go&quot;&gt;drainAndCloseBody&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-variable syntax-parameter syntax-go&quot;&gt;body&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt; io.ReadCloser&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt; &lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;
    io&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-function syntax-go&quot;&gt;Copy&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;io&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-other syntax-member syntax-go&quot;&gt;Discard&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-separator syntax-go&quot;&gt;,&lt;/span&gt; body&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;syntax-comment syntax-line syntax-double-slash syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-comment syntax-go&quot;&gt;//&lt;/span&gt; Drain the response body before closing it.
&lt;/span&gt;    body&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-function syntax-go&quot;&gt;Close&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-end syntax-go&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;While this works for small responses, if the unread body is large, establishing a new TCP connection can be faster than downloading and discarding the rest of the body. A better approach is to cap the number of bytes we are willing to drain:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;code-snippet&quot; data-language=&quot;Go&quot;&gt;&lt;span class=&quot;syntax-source syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-declaration syntax-go&quot;&gt;&lt;span class=&quot;syntax-storage syntax-type syntax-go&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;syntax-entity syntax-name syntax-function syntax-go&quot;&gt;drainAndCloseBody&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-variable syntax-parameter syntax-go&quot;&gt;body&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt; io.ReadCloser&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt; &lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;
    io&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-function syntax-go&quot;&gt;CopyN&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;io&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-other syntax-member syntax-go&quot;&gt;Discard&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-separator syntax-go&quot;&gt;,&lt;/span&gt; body&lt;span class=&quot;syntax-punctuation syntax-separator syntax-go&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-go&quot;&gt;256&lt;/span&gt;&lt;span class=&quot;syntax-keyword syntax-operator syntax-go&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-go&quot;&gt;10&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;syntax-comment syntax-line syntax-double-slash syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-comment syntax-go&quot;&gt;//&lt;/span&gt; Only drain up to 256 KB.
&lt;/span&gt;    body&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-function syntax-go&quot;&gt;Close&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-end syntax-go&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;However, a server might send a response body that trickles in slowly, so we also need to cap the time we spend draining:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;code-snippet&quot; data-language=&quot;Go&quot;&gt;&lt;span class=&quot;syntax-source syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-declaration syntax-go&quot;&gt;&lt;span class=&quot;syntax-storage syntax-type syntax-go&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;syntax-entity syntax-name syntax-function syntax-go&quot;&gt;drainAndCloseBody&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-variable syntax-parameter syntax-go&quot;&gt;body&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt; io.ReadCloser&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt; &lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;
    &lt;span class=&quot;syntax-meta syntax-initialization syntax-short syntax-go&quot;&gt;&lt;span class=&quot;syntax-variable syntax-other syntax-go&quot;&gt;drainDone&lt;/span&gt; &lt;span class=&quot;syntax-keyword syntax-operator syntax-initialize syntax-go&quot;&gt;:=&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;syntax-meta syntax-function-call syntax-go&quot;&gt;&lt;span class=&quot;syntax-support syntax-function syntax-builtin syntax-go&quot;&gt;make&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-storage syntax-type syntax-go&quot;&gt;chan&lt;/span&gt; &lt;span class=&quot;syntax-storage syntax-type syntax-go&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-end syntax-go&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-separator syntax-go&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-go&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;syntax-keyword syntax-control syntax-go&quot;&gt;go&lt;/span&gt; &lt;span class=&quot;syntax-meta syntax-function syntax-declaration syntax-anonymous syntax-go&quot;&gt;&lt;span class=&quot;syntax-storage syntax-type syntax-go&quot;&gt;func&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt; &lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;
        io&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-function syntax-go&quot;&gt;CopyN&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;io&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-other syntax-member syntax-go&quot;&gt;Discard&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-separator syntax-go&quot;&gt;,&lt;/span&gt; body&lt;span class=&quot;syntax-punctuation syntax-separator syntax-go&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-go&quot;&gt;256&lt;/span&gt;&lt;span class=&quot;syntax-keyword syntax-operator syntax-go&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-go&quot;&gt;10&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;syntax-comment syntax-line syntax-double-slash syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-comment syntax-go&quot;&gt;//&lt;/span&gt; Only drain up to 256 KB.
&lt;/span&gt;        drainDone &lt;span class=&quot;syntax-keyword syntax-operator syntax-channel syntax-go&quot;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&quot;syntax-storage syntax-type syntax-go&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-end syntax-go&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-end syntax-go&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-end syntax-go&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;syntax-comment syntax-line syntax-double-slash syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-comment syntax-go&quot;&gt;//&lt;/span&gt; Only spend at most 50 ms trying to drain the response body.
&lt;/span&gt;    &lt;span class=&quot;syntax-keyword syntax-control syntax-go&quot;&gt;select&lt;/span&gt; &lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;syntax-keyword syntax-control syntax-go&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;syntax-keyword syntax-operator syntax-channel syntax-go&quot;&gt;&amp;lt;-&lt;/span&gt;drainDone&lt;span class=&quot;syntax-punctuation syntax-separator syntax-go&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;syntax-keyword syntax-control syntax-go&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;syntax-keyword syntax-operator syntax-channel syntax-go&quot;&gt;&amp;lt;-&lt;/span&gt;time&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-function syntax-go&quot;&gt;After&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-go&quot;&gt;50&lt;/span&gt; &lt;span class=&quot;syntax-keyword syntax-operator syntax-go&quot;&gt;*&lt;/span&gt; time&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-other syntax-member syntax-go&quot;&gt;Millisecond&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-separator syntax-go&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;syntax-comment syntax-line syntax-double-slash syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-comment syntax-go&quot;&gt;//&lt;/span&gt; If we reach the 50 ms timeout, body.Close will run and interrupt the
&lt;/span&gt;        &lt;span class=&quot;syntax-comment syntax-line syntax-double-slash syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-comment syntax-go&quot;&gt;//&lt;/span&gt; io.CopyN, preventing goroutine leaks.
&lt;/span&gt;    &lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-end syntax-go&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
    body&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-function syntax-go&quot;&gt;Close&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-end syntax-go&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Of course, we also do not want to block for up to 50 milliseconds when closing a response body. Instead, we can drain the body asynchronously in the background and let it race against subsequent requests:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;code-snippet&quot; data-language=&quot;Go&quot;&gt;&lt;span class=&quot;syntax-source syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-declaration syntax-go&quot;&gt;&lt;span class=&quot;syntax-storage syntax-type syntax-go&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;syntax-entity syntax-name syntax-function syntax-go&quot;&gt;drainAndCloseBody&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-variable syntax-parameter syntax-go&quot;&gt;body&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt; io.ReadCloser&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt; &lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;
    &lt;span class=&quot;syntax-meta syntax-initialization syntax-short syntax-go&quot;&gt;&lt;span class=&quot;syntax-variable syntax-other syntax-go&quot;&gt;drainDone&lt;/span&gt; &lt;span class=&quot;syntax-keyword syntax-operator syntax-initialize syntax-go&quot;&gt;:=&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;syntax-meta syntax-function-call syntax-go&quot;&gt;&lt;span class=&quot;syntax-support syntax-function syntax-builtin syntax-go&quot;&gt;make&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-storage syntax-type syntax-go&quot;&gt;chan&lt;/span&gt; &lt;span class=&quot;syntax-storage syntax-type syntax-go&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-end syntax-go&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-separator syntax-go&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-go&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;syntax-keyword syntax-control syntax-go&quot;&gt;go&lt;/span&gt; &lt;span class=&quot;syntax-meta syntax-function syntax-declaration syntax-anonymous syntax-go&quot;&gt;&lt;span class=&quot;syntax-storage syntax-type syntax-go&quot;&gt;func&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt; &lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;
        io&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-function syntax-go&quot;&gt;CopyN&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;io&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-other syntax-member syntax-go&quot;&gt;Discard&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-separator syntax-go&quot;&gt;,&lt;/span&gt; body&lt;span class=&quot;syntax-punctuation syntax-separator syntax-go&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-go&quot;&gt;256&lt;/span&gt;&lt;span class=&quot;syntax-keyword syntax-operator syntax-go&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-go&quot;&gt;10&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;syntax-comment syntax-line syntax-double-slash syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-comment syntax-go&quot;&gt;//&lt;/span&gt; Only drain up to 256 KB.
&lt;/span&gt;        drainDone &lt;span class=&quot;syntax-keyword syntax-operator syntax-channel syntax-go&quot;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&quot;syntax-storage syntax-type syntax-go&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-end syntax-go&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-end syntax-go&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-end syntax-go&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;syntax-keyword syntax-control syntax-go&quot;&gt;go&lt;/span&gt; &lt;span class=&quot;syntax-meta syntax-function syntax-declaration syntax-anonymous syntax-go&quot;&gt;&lt;span class=&quot;syntax-storage syntax-type syntax-go&quot;&gt;func&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt; &lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;
        &lt;span class=&quot;syntax-comment syntax-line syntax-double-slash syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-comment syntax-go&quot;&gt;//&lt;/span&gt; Only spend at most 50 ms trying to drain the response body.
&lt;/span&gt;        &lt;span class=&quot;syntax-keyword syntax-control syntax-go&quot;&gt;select&lt;/span&gt; &lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;syntax-keyword syntax-control syntax-go&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;syntax-keyword syntax-operator syntax-channel syntax-go&quot;&gt;&amp;lt;-&lt;/span&gt;drainDone&lt;span class=&quot;syntax-punctuation syntax-separator syntax-go&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;syntax-comment syntax-line syntax-double-slash syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-comment syntax-go&quot;&gt;//&lt;/span&gt; If the drain can finish before a new request is sent, the
&lt;/span&gt;            &lt;span class=&quot;syntax-comment syntax-line syntax-double-slash syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-comment syntax-go&quot;&gt;//&lt;/span&gt; connection will be reused; otherwise, a new connection is
&lt;/span&gt;            &lt;span class=&quot;syntax-comment syntax-line syntax-double-slash syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-comment syntax-go&quot;&gt;//&lt;/span&gt; created, and the current connection will be put in a pool of
&lt;/span&gt;            &lt;span class=&quot;syntax-comment syntax-line syntax-double-slash syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-comment syntax-go&quot;&gt;//&lt;/span&gt; idle connections, potentially being reused for another future
&lt;/span&gt;            &lt;span class=&quot;syntax-comment syntax-line syntax-double-slash syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-comment syntax-go&quot;&gt;//&lt;/span&gt; request.
&lt;/span&gt;        &lt;span class=&quot;syntax-keyword syntax-control syntax-go&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;syntax-keyword syntax-operator syntax-channel syntax-go&quot;&gt;&amp;lt;-&lt;/span&gt;time&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-function syntax-go&quot;&gt;After&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-go&quot;&gt;50&lt;/span&gt; &lt;span class=&quot;syntax-keyword syntax-operator syntax-go&quot;&gt;*&lt;/span&gt; time&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-other syntax-member syntax-go&quot;&gt;Millisecond&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-separator syntax-go&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;syntax-comment syntax-line syntax-double-slash syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-comment syntax-go&quot;&gt;//&lt;/span&gt; If we reach the 50 ms timeout, body.Close will run and interrupt
&lt;/span&gt;            &lt;span class=&quot;syntax-comment syntax-line syntax-double-slash syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-comment syntax-go&quot;&gt;//&lt;/span&gt; the io.CopyN, preventing goroutine leaks.
&lt;/span&gt;        &lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-end syntax-go&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
        body&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-function syntax-go&quot;&gt;Close&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-end syntax-go&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-end syntax-go&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As we can see, draining response bodies safely is surprisingly tricky and cumbersome. Worse, as the practice of draining response bodies spread, some nuances were often lost. This has led to misunderstandings such as attempting to drain response bodies for HTTP/2 connections, when doing so is unnecessary.&lt;/p&gt;
&lt;h2&gt;The current state and conclusion&lt;/h2&gt;
&lt;p&gt;Starting in Go 1.27, &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://go.dev/pkg/net/http#Transport&quot;&gt;&lt;code&gt;net/http.Transport&lt;/code&gt;&lt;/a&gt; automatically does everything we have implemented in the code above: it will asynchronously drain an unread HTTP/1 response body for up to 50 ms or 256 KB. It also implements additional optimizations; for example, when a response contains the &lt;code&gt;Connection: close&lt;/code&gt; header, draining the body is guaranteed to be wasted work, and it therefore skips doing so. Note that this behavior might evolve in future versions of Go, as other possible enhancements become apparent.&lt;/p&gt;
&lt;p&gt;As a general best practice, we now recommend that users simply close their HTTP bodies once they no longer need them, like in our original example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;code-snippet&quot; data-language=&quot;Go&quot;&gt;&lt;span class=&quot;syntax-source syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-declaration syntax-go&quot;&gt;&lt;span class=&quot;syntax-storage syntax-type syntax-go&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;syntax-entity syntax-name syntax-function syntax-go&quot;&gt;getStatus&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-variable syntax-parameter syntax-go&quot;&gt;url&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt; &lt;span class=&quot;syntax-storage syntax-type syntax-go&quot;&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-parameters syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt; &lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-return-type syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-return-type syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-storage syntax-type syntax-go&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-separator syntax-go&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;syntax-storage syntax-type syntax-go&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt; &lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;
    &lt;span class=&quot;syntax-meta syntax-initialization syntax-short syntax-go&quot;&gt;&lt;span class=&quot;syntax-variable syntax-other syntax-go&quot;&gt;resp&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-separator syntax-go&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;syntax-variable syntax-other syntax-go&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;syntax-keyword syntax-operator syntax-initialize syntax-go&quot;&gt;:=&lt;/span&gt;&lt;/span&gt; http&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-function syntax-go&quot;&gt;Get&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;syntax-keyword syntax-control syntax-go&quot;&gt;if&lt;/span&gt; err &lt;span class=&quot;syntax-keyword syntax-operator syntax-go&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;syntax-constant syntax-language syntax-go&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;syntax-keyword syntax-control syntax-go&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-go&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-separator syntax-go&quot;&gt;,&lt;/span&gt; err
    &lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-end syntax-go&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;syntax-keyword syntax-control syntax-go&quot;&gt;defer&lt;/span&gt; resp&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-other syntax-member syntax-go&quot;&gt;Body&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-function syntax-go&quot;&gt;Close&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-method syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-group syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-group syntax-end syntax-go&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;syntax-keyword syntax-control syntax-go&quot;&gt;return&lt;/span&gt; resp&lt;span class=&quot;syntax-punctuation syntax-accessor syntax-go&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-other syntax-member syntax-go&quot;&gt;StatusCode&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-separator syntax-go&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;syntax-constant syntax-language syntax-go&quot;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function syntax-go&quot;&gt;&lt;span class=&quot;syntax-meta syntax-block syntax-go&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-block syntax-end syntax-go&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Go is all about simplicity. Let your code stay clean and simple, and let &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://go.dev/pkg/net/http&quot;&gt;&lt;code&gt;net/http&lt;/code&gt;&lt;/a&gt; deal with the complexities on your behalf.&lt;/p&gt;
</content>
  </entry>
</feed>
