并发访问reflect.Value

时间:2016-08-31 19:19:59

标签: go concurrency

如果我正在编写一个动态修改变量值的函数,那么我将如何使该函数对于并发使用是安全的。例如,请考虑以下代码段:

func set(v, d interface{}) error {
    val := reflect.ValueOf(v)
    dst := reflect.ValueOf(d).Elem()

    if dst.Type() != val.Type() {
        return fmt.Errorf("incompatible types - %s %s", dst.Type(), val.Type())
    }
    dst.Set(val)
    return nil
}

将按以下方式调用此函数:

i := 1
var j int
_ = set(i, &j)

工作代码:https://play.golang.org/p/XjlHrDLFqd

同时更改i的安全性如何? reflect.Value docs说出以下内容:

  

值可以由多个goroutine同时使用,前提是   底层Go值可以同时用于等效值   直接运营。

这让我相信需要锁定。如果是这样,锁定部件将去哪里?是否需要保持直到值(具体)完全通过反射部分?例如,在上面的示例中,是否可以通过set执行锁定?

此外,什么是一些不能同时使用的基础Go值(如上文文档中所述)?

0 个答案:

没有答案