interview-go icon indicating copy to clipboard operation
interview-go copied to clipboard

q014.go有误

Open laotoutou opened this issue 5 years ago • 5 comments

laotoutou avatar Sep 12 '20 06:09 laotoutou

“上面的代码有严重的内存泄漏问题,出错的位置是 go fn(i),实际上代码执行后会启动 4 个协程,但是因为 ch 是非缓冲的,只可能有一个协程写入成功。而其他三个协程会一直在后台等待写入。”

type query func(string) string

func exec(name string, vs ...query) string {
    ch := make(chan string)
    fn := func(i int) {
        ch <- vs[i](name)
    }
    for i, _ := range vs {
        go fn(i)
    }
    return <-ch
}

func main() {
    ret := exec("111", func(n string) string {
        return n + "func1"
    }, func(n string) string {
        return n + "func2"
    }, func(n string) string {
        return n + "func3"
    }, func(n string) string {
        return n + "func4"
    })
    fmt.Println(ret)
}

实际上4个协程都不能写入成功,因为ch是一个空的channel

laotoutou avatar Sep 12 '20 06:09 laotoutou

空的channel是什么意思?

lifei6671 avatar Sep 15 '20 03:09 lifei6671

空的channel是什么意思?

应该ch := make(chan string, 1)

laotoutou avatar Sep 17 '20 12:09 laotoutou

这是不是空channel,是无缓冲channel,需要有一个读才能有一个写,这个题目里面只有一个读操作,所以也只可能有一个写操作成功。

lifei6671 avatar Sep 17 '20 12:09 lifei6671

明白了,谢谢 引用别人的话: “无缓冲的 就是一个送信人去你家门口送信 ,你不在家 他不走,你一定要接下信,他才会走。

无缓冲保证信能到你手上

有缓冲的 就是一个送信人去你家仍到你家的信箱 转身就走 ,除非你的信箱满了 他必须等信箱空下来。

有缓冲的 保证 信能进你家的邮箱”

laotoutou avatar Sep 23 '20 17:09 laotoutou