如何将**T类型的变量转换为*unsafe.Pointer
下面的示例将给出编译错误:
无法将&ptr (类型**s)转换为*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的地址
Ps。我选择用sync/atomic做一个例子,因为在这种情况下,您实际上必须进行这样的转换。
编辑
一个不正确的解决方案是使用一个临时变量:
up := unsafe.Pointer(ptr)
atomic.CompareAndSwapPointer(&up, ...在编译时,CAS将只交换存储在up中的内容,而不是ptr中的存储内容。正如zeebo@#go- not所指出的,这并不是理想的结果。
发布于 2012-08-14 22:14:34
mcef@#go-坚果发布了如何转换**T的答案:
(*unsafe.Pointer)(unsafe.Pointer),其中ptr类型为**T。
zeebo@#go-螺母提供了一个工作示例(在这里发布是允许的):
package main
import (
"fmt"
"sync/atomic"
"unsafe"
)
type T struct {
value int
}
func Swap(dest **T, old, new *T) bool {
udest := (*unsafe.Pointer)(unsafe.Pointer(dest))
return atomic.CompareAndSwapPointer(udest,
unsafe.Pointer(old),
unsafe.Pointer(new),
)
}
func main() {
x := &T{42}
n := &T{50}
fmt.Println(*x, *n)
p := x
Swap(&x, p, n)
fmt.Println(*x, *n)
}https://stackoverflow.com/questions/11960743
复制相似问题