• With issues:
 goroutine profile: total 7754
7687 @ 0x44066e 0x4393d7 0x472605 0x4e5a27 0x4e6d1a 0x4e6d08 0x539305 0x547545 0x7058fb 0x563578 0x705ade 0x702bef 0x709496 0x709497 0x7c212b 0x5d5663 0x5d5793 0x7c7e89 0x477fe1
#   0x472604    internal/poll.runtime_pollWait+0x84     D:/Go/src/runtime/netpoll.go:345
#   0x4e5a26    internal/poll.(*pollDesc).wait+0x26     D:/Go/src/internal/poll/fd_poll_runtime.go:84
#   0x4e6d19    internal/poll.(*pollDesc).waitRead+0x279    D:/Go/src/internal/poll/fd_poll_runtime.go:89
#   0x4e6d07    internal/poll.(*FD).Read+0x267          D:/Go/src/internal/poll/fd_unix.go:164
#   0x539304    net.(*netFD).Read+0x24              D:/Go/src/net/fd_posix.go:55
#   0x547544    net.(*conn).Read+0x44               D:/Go/src/net/net.go:179
#   0x7058fa    crypto/tls.(*atLeastReader).Read+0x3a       D:/Go/src/crypto/tls/conn.go:806
#   0x563577    bytes.(*Buffer).ReadFrom+0x97           D:/Go/src/bytes/buffer.go:211
#   0x705add    crypto/tls.(*Conn).readFromUntil+0xdd       D:/Go/src/crypto/tls/conn.go:828
#   0x702bee    crypto/tls.(*Conn).readRecordOrCCS+0x3ce    D:/Go/src/crypto/tls/conn.go:626
#   0x709495    crypto/tls.(*Conn).readRecord+0x155     D:/Go/src/crypto/tls/conn.go:588
#   0x709496    crypto/tls.(*Conn).Read+0x156           D:/Go/src/crypto/tls/conn.go:1370
#   0x7c212a    net/http.(*connReader).Read+0x14a       D:/Go/src/net/http/server.go:789
#   0x5d5662    bufio.(*Reader).fill+0x102          D:/Go/src/bufio/bufio.go:110
#   0x5d5792    bufio.(*Reader).Peek+0x52           D:/Go/src/bufio/bufio.go:148
#   0x7c7e88    net/http.(*conn).serve+0x748            D:/Go/src/net/http/server.go:2074

Description

How to reproduce

package main

import (
    "github.com/gin-gonic/gin"
)

func main() {
    g := gin.Default()
    g.GET("/hello/:name", func(c *gin.Context) {
        c.String(200, "Hello %s", c.Param("name"))
    })
    g.Run(":9000")
}

Expectations

$ curl http://localhost:9000/hello/world
Hello world

Actual result

$ curl -i http://localhost:9000/hello/world
<YOUR RESULT>

Environment

  • go version:
  • gin version (or commit ref):
  • operating system:

Comment From: clement2026

@introspection3 I can’t reproduce this. Could you share more details, like the Gin version and your OS?

Gin goroutine leak

Comment From: abuzaforfagun

Can not reproduce this, here is my output:

goroutine 7 [running]:
runtime/pprof.writeGoroutineStacks({0x9a7be0, 0xc0001d61c0})
    C:/Program Files/Go/src/runtime/pprof/pprof.go:761 +0x6a
runtime/pprof.writeGoroutine({0x9a7be0?, 0xc0001d61c0?}, 0xc00018bb30?)
    C:/Program Files/Go/src/runtime/pprof/pprof.go:750 +0x25
runtime/pprof.(*Profile).WriteTo(0xc39560?, {0x9a7be0?, 0xc0001d61c0?}, 0xc?)
    C:/Program Files/Go/src/runtime/pprof/pprof.go:374 +0x14b
net/http/pprof.handler.ServeHTTP({0xc00018c6d1, 0x9}, {0x9aab60, 0xc0001d61c0}, 0xc000198640)
    C:/Program Files/Go/src/net/http/pprof/pprof.go:272 +0x52f
net/http/pprof.Index({0x9aab60, 0xc0001d61c0}, 0xc000198640?)
    C:/Program Files/Go/src/net/http/pprof/pprof.go:388 +0xde
net/http.HandlerFunc.ServeHTTP(0xc509e0?, {0x9aab60?, 0xc0001d61c0?}, 0x6d0f76?)
    C:/Program Files/Go/src/net/http/server.go:2220 +0x29
net/http.(*ServeMux).ServeHTTP(0x4db2d9?, {0x9aab60, 0xc0001d61c0}, 0xc000198640)
    C:/Program Files/Go/src/net/http/server.go:2747 +0x1ca
net/http.serverHandler.ServeHTTP({0xc00018b9e0?}, {0x9aab60?, 0xc0001d61c0?}, 0x6?)
    C:/Program Files/Go/src/net/http/server.go:3210 +0x8e
net/http.(*conn).serve(0xc0000e01b0, {0x9ab458, 0xc00010c2d0})
    C:/Program Files/Go/src/net/http/server.go:2092 +0x5d0
created by net/http.(*Server).Serve in goroutine 18
    C:/Program Files/Go/src/net/http/server.go:3360 +0x485

goroutine 1 [IO wait]:
internal/poll.runtime_pollWait(0x15e48234f68, 0x72)
    C:/Program Files/Go/src/runtime/netpoll.go:351 +0x85
internal/poll.(*pollDesc).wait(0x5722d5?, 0x4dc745?, 0x0)
    C:/Program Files/Go/src/internal/poll/fd_poll_runtime.go:84 +0x27
internal/poll.execIO(0xc00018e2a0, 0xc000187a58)
    C:/Program Files/Go/src/internal/poll/fd_windows.go:177 +0x105
internal/poll.(*FD).acceptOne(0xc00018e288, 0x1c4, {0xc0001de000?, 0xc000187b40?, 0x4dc4dd?}, 0x10?)
    C:/Program Files/Go/src/internal/poll/fd_windows.go:946 +0x65
internal/poll.(*FD).Accept(0xc00018e288, 0xc000187c38)
    C:/Program Files/Go/src/internal/poll/fd_windows.go:980 +0x1b6
net.(*netFD).accept(0xc00018e288)
    C:/Program Files/Go/src/net/fd_windows.go:182 +0x4b
net.(*TCPListener).accept(0xc000192580)
    C:/Program Files/Go/src/net/tcpsock_posix.go:159 +0x1e
net.(*TCPListener).Accept(0xc000192580)
    C:/Program Files/Go/src/net/tcpsock.go:372 +0x30
net/http.(*Server).Serve(0xc0001b24b0, {0x9aabf0, 0xc000192580})
    C:/Program Files/Go/src/net/http/server.go:3330 +0x30c
net/http.(*Server).ListenAndServe(0xc0001b24b0)
    C:/Program Files/Go/src/net/http/server.go:3259 +0x71
net/http.ListenAndServe(...)
    C:/Program Files/Go/src/net/http/server.go:3514
github.com/gin-gonic/gin.(*Engine).Run(0xc0001ba1a0, {0xc000187f30, 0x1, 0x1})
    C:/Users/Fagun/go/pkg/mod/github.com/gin-gonic/gin@v1.10.0/gin.go:399 +0x211
main.main()
    C:/Personal Interest/OpenSource/gin/goroutine-leak/main.go:19 +0xa5

goroutine 18 [IO wait]:
internal/poll.runtime_pollWait(0x15e48234e60, 0x72)
    C:/Program Files/Go/src/runtime/netpoll.go:351 +0x85
internal/poll.(*pollDesc).wait(0x5722d5?, 0x4dc4dd?, 0x0)
    C:/Program Files/Go/src/internal/poll/fd_poll_runtime.go:84 +0x27
internal/poll.execIO(0xc000140020, 0xc000083bc8)
    C:/Program Files/Go/src/internal/poll/fd_windows.go:177 +0x105
internal/poll.(*FD).acceptOne(0xc000140008, 0x21c, {0xc00002a0f0?, 0xc000083c28?, 0x577065?}, 0xc000083c5c?)
    C:/Program Files/Go/src/internal/poll/fd_windows.go:946 +0x65
internal/poll.(*FD).Accept(0xc000140008, 0xc000083da8)
    C:/Program Files/Go/src/internal/poll/fd_windows.go:980 +0x1b6
net.(*netFD).accept(0xc000140008)
    C:/Program Files/Go/src/net/fd_windows.go:182 +0x4b
net.(*TCPListener).accept(0xc000116080)
    C:/Program Files/Go/src/net/tcpsock_posix.go:159 +0x1e
net.(*TCPListener).Accept(0xc000116080)
    C:/Program Files/Go/src/net/tcpsock.go:372 +0x30
net/http.(*Server).Serve(0xc00010a000, {0x9aabf0, 0xc000116080})
    C:/Program Files/Go/src/net/http/server.go:3330 +0x30c
net/http.(*Server).ListenAndServe(0xc00010a000)
    C:/Program Files/Go/src/net/http/server.go:3259 +0x71
net/http.ListenAndServe(...)
    C:/Program Files/Go/src/net/http/server.go:3514
main.main.func1()
    C:/Personal Interest/OpenSource/gin/goroutine-leak/main.go:12 +0x37
created by main.main in goroutine 1
    C:/Personal Interest/OpenSource/gin/goroutine-leak/main.go:11 +0x1e

goroutine 20 [IO wait]:
internal/poll.runtime_pollWait(0x15e48234d58, 0x72)
    C:/Program Files/Go/src/runtime/netpoll.go:351 +0x85
internal/poll.(*pollDesc).wait(0xc000123dd8?, 0xc000123e00?, 0x0)
    C:/Program Files/Go/src/internal/poll/fd_poll_runtime.go:84 +0x27
internal/poll.execIO(0xc000098520, 0x92eb48)
    C:/Program Files/Go/src/internal/poll/fd_windows.go:177 +0x105
internal/poll.(*FD).Read(0xc000098508, {0xc00018b9f1, 0x1, 0x1})
    C:/Program Files/Go/src/internal/poll/fd_windows.go:438 +0x2a7
net.(*netFD).Read(0xc000098508, {0xc00018b9f1?, 0xc000123f48?, 0x4e2f30?})
    C:/Program Files/Go/src/net/fd_posix.go:55 +0x25
net.(*conn).Read(0xc00007a710, {0xc00018b9f1?, 0x1?, 0xc995a0?})
    C:/Program Files/Go/src/net/net.go:189 +0x45
net/http.(*connReader).backgroundRead(0xc00018b9e0)
    C:/Program Files/Go/src/net/http/server.go:690 +0x37
created by net/http.(*connReader).startBackgroundRead in goroutine 7
    C:/Program Files/Go/src/net/http/server.go:686 +0xb6

Environment: Go: 1.23.1 GIN: 1.10.0 OS: Windows 11

Comment From: appleboy

Can't reproduce.

Comment From: introspection3

@appleboy sir,I resolved this by

func GetRquestReturnBytes(url string) (body []byte, err error) {
    tr := &http.Transport{
        TLSClientConfig:     &tls.Config{InsecureSkipVerify: true},
        DisableKeepAlives:   true, //by this
        MaxIdleConnsPerHost: 14,
    }
    client := &http.Client{Transport: tr, Timeout: 7 * time.Second}
    req, err := http.NewRequest("GET", url, nil)
    req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36")

    req.Header.Set("Content-Type", "application/json")
    if err != nil {
        return

    }

    resp, err := client.Do(req)
    if err != nil {
        return
    }
    defer resp.Body.Close()
    defer client.CloseIdleConnections()  //by this
    body, err = io.ReadAll(resp.Body)
    return
}

Comment From: introspection3

Can't reproduce.

you can delete two lines code

Comment From: FarmerChillax

@appleboy sir,I resolved this by

```go func GetRquestReturnBytes(url string) (body []byte, err error) { tr := &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, DisableKeepAlives: true, //by this MaxIdleConnsPerHost: 14, } client := &http.Client{Transport: tr, Timeout: 7 * time.Second} req, err := http.NewRequest("GET", url, nil) req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36")

req.Header.Set("Content-Type", "application/json") if err != nil { return

}

resp, err := client.Do(req) if err != nil { return } defer resp.Body.Close() defer client.CloseIdleConnections() //by this body, err = io.ReadAll(resp.Body) return } ```

How does this relate to gin with this code?

If you want the problem to be solved, please provide a complete reproducible example related to gin