Go 语言中地址的按位异或

Bitwise XOR on address in GoLang

我试图在 Go 中实现异或链表,我必须在其中存储异或地址。在 C/C++ 中非常简单

(*struct_type)(([unsigned] int)nodeA ^ ([unsigned] int)nodeB)

我在 Go 中尝试了类似的方法。我有一个名为 Node 的结构,其中包含两个节点 nodeA 和 nodeB。为此,我尝试了以下方法:

*Node(uint(nodeA) ^ uint(nodeB))

这给了我一个错误提示,无法将 Node 类型转换为 uint。 我尝试过的另一种方法是

nodeA ^ nodeB

有没有办法将地址解析为int类型,异或,然后重新解析为节点地址?还是 Go 提供了一个我不知道的简单解决方案?

使用unsafe.Pointer进行指针运算:

a := &T{}
b := &T{}
x := uintptr(unsafe.Pointer(a)) ^ uintptr(unsafe.Pointer(b))
y := (*T)(unsafe.Pointer(uintptr(unsafe.Pointer(a)) ^ x))
fmt.Println(b == y)  // prints true

GC 使用指针来跟踪内存。如果代码改写为

a := &T{}
b := &T{}
x := uintptr(unsafe.Pointer(a)) ^ uintptr(unsafe.Pointer(b))
b = nil // clear all pointers to struct
b = (*T)(unsafe.Pointer(uintptr(unsafe.Pointer(a)) ^ x))

那么 GC 就有可能在最后一次赋值给 b 之前收集到 b 指向的结构。

在 Go 中无法实现安全的 XOR 列表,因为 GC 可以收集元素。

不要这样做。

您不能在 Go 中实现异或链表。 Go 垃圾收集器 (GC) 使用指针值来跟踪正在使用的内存。如果你破坏了一个指针值,GC 将不会工作。

感谢您指出 Go 不支持指针运算。我做了一个快速的研究,发现并使用了 Go 提供的 usafe 包,以防 "unsafe" 需要工作。我用以下代码行解决了这个问题:

a := unsafe.Pointer(nodeA)
b := unsafe.Pointer(nodeB)
return (*Node)(unsafe.Pointer(uintptr(a) ^ uintptr(b)))

docs 包不安全。