gpt4 book ai didi

pointers - 在 Go 中将 **T 转换为 *unsafe.Pointer

转载 作者:IT王子 更新时间:2023-10-29 01:26:57 24 4
gpt4 key购买 nike

如何将 **T 类型的变量转换为 *unsafe.Pointer

下面的例子会给出编译错误:

cannot convert &ptr (type **s) to 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),我会得到这个编译错误:

cannot take the address of unsafe.Pointer(ptr)

附言。我选择用 sync/atomic 做一个例子,因为在这种情况下你实际上必须进行这样的转换。

编辑

一个不正确的解决方案是使用临时变量:

up := unsafe.Pointer(ptr)
atomic.CompareAndSwapPointer(&up, ...

在编译时,CAS 只会交换存储在 up 中的内容,而不是 ptr 中的内容。正如 zeebo@#go-nuts 指出的那样,这不是期望的结果。

最佳答案

mcef@#go-nuts 发布了如何转换 **T 的答案:

(*unsafe.Pointer)(unsafe.Pointer(ptr)), where ptr is of type **T.

zeebo@#go-nuts 提供了一个工作示例(已获得许可发布在这里):

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)
}

关于pointers - 在 Go 中将 **T 转换为 *unsafe.Pointer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11960743/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com