Page tree
Skip to end of metadata
Go to start of metadata

for 循环里面, 变量是重复赋值的, 不要想当然的当作每次创建一个新的局部变量. 所以在 循环体 里面千万不能取引用. 类似的道理, 在 循环体里面创建 goroutine, 也一定要记得将参数拷贝带进去, 否则会绑定到循环最后复制变量.

ws := make(map[string]io.Writer)
for k, c := range m {
    // ERROR 最终都指向最后一个
    ws[k] = &Writer{c: &c} // 这里其实原来是 func (c *Conf) New() ... 不影响结果

    // OK 拷贝变量, 而不是指针引用
    w := &Writer{c: c}
    // OK 拷贝一份局部变量
    c2 := c
    w := &Writer{c: c2}

    // ERROR
    go func() {
        w := &Writer{c: c}
        w.Start()
    }

    // DO
    go func(c Conf) {
        w := &Writer{c: c}
        w.Start()
    }(c)
}


参考:https://github.com/golang/go/issues/7834

  • No labels
Write a comment...