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)
}