Memory leaks 垃圾收集器会收集永远不会继续的Go例程吗?

Memory leaks 垃圾收集器会收集永远不会继续的Go例程吗?,memory-leaks,go,goroutine,Memory Leaks,Go,Goroutine,将以下代码作为一个简化示例: func printer(c <-chan int) { for { fmt.Print(<-c) } } func provide() { c := make(chan int) go printer(c) for i := 1; i <= 100; i++ { c <- i } } func-printer(c请尝试以下程序以验证这是否确实会泄漏内存。

将以下代码作为一个简化示例:

func printer(c <-chan int) {
    for {
        fmt.Print(<-c)
    }
}

func provide() {
    c := make(chan int)

    go printer(c)

    for i := 1; i <= 100; i++ {
        c <- i
    }
}

func-printer(c请尝试以下程序以验证这是否确实会泄漏内存。请注意,此程序会很快耗尽您的RAM;请准备将其杀死

package main

func worker(c <-chan int) {
    var i int

    for {
        i += <-c
    }
}

func wrapper() {
    c := make(chan int)

    go worker(c)

    for i := 0; i < 0xff; i++ {
        c <- i
    }
}

func main() {
    for {
        wrapper()
    }
}
主程序包

func worker(c关闭通道。从关闭的通道读取始终成功,并返回相应的零值。可选的第二个布尔返回值指示第一个值的有效性

:

用于表单赋值或初始化的接收表达式


谢谢。显然,我的“解决方案”没有很好地工作。在打印机goroutine中使用range子句可以避免ok检查->for v:=range c{fmt.Println(v)}
package main

func worker(c <-chan int) {
    var i int

    for {
        i += <-c
    }
}

func wrapper() {
    c := make(chan int)
    defer close(c) // fix here

    go worker(c)

    for i := 0; i < 0xff; i++ {
        c <- i
    }
}

func main() {
    for {
        wrapper()
    }
}
x, ok = <-ch
x, ok := <-ch
var x, ok = <-ch
func printer(c <-chan int) {
        for {
                v, ok := <-c
                if !ok { // chan closed
                        return
                }

                // v is valid
                fmt.Println(v)
        }
}

func provide() {
        c := make(chan int)

        go printer(c)

        for i := 1; i <= 100; i++ {
                c <- i
        }
        close(c)
}