如果我正在编写一个动态修改变量值的函数,那么我将如何使该函数对于并发使用是安全的。例如,请考虑以下代码段:
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值(如上文文档中所述)?