如何将类型变量转换**T
为*unsafe.Pointer
?
下面的示例将给出编译错误:
无法将 &ptr (type **s) 转换为 type *unsafe.Pointer
package main
import (
"sync/atomic"
"unsafe"
)
type s struct {
value int
}
func main(){
var ptr *s
a := &s{42}
old := ptr
atomic.CompareAndSwapPointer(
(*unsafe.Pointer)(&ptr), // &unsafe.Pointer(ptr)
unsafe.Pointer(old),
unsafe.Pointer(a))
}
如果我切换(*unsafe.Pointer)(&ptr)
到&unsafe.Pointer(ptr)
,我会得到这个编译错误:
不能取 unsafe.Pointer(ptr) 的地址
附言。我选择做一个例子,sync/atomic
因为这是你实际上必须进行这种转换的一种情况。
编辑
一种不正确的解决方案是使用临时变量:
up := unsafe.Pointer(ptr)
atomic.CompareAndSwapPointer(&up, ...
在编译时,CAS 只会交换存储在up
而不是ptr
. 正如 zeebo@#go-nuts 所指出的,这不是预期的结果。