Pointers 如何比较围棋中的指针?

Pointers 如何比较围棋中的指针?,pointers,go,comparison,Pointers,Go,Comparison,我正在构建一些测试代码,并尝试将指针与运算符进行比较。我的目标是将元素排序到一个平衡的树结构中(由我实现)。为此,我需要快速、通用的比较。遵循古老的C/C++习惯,我现在的想法是(…在写这篇文章时是)通过指针地址来比较它们 然而,正如我发现的,它不起作用。源头 if (&(a.val) < &(b.val)) { if(&(a.val) b>代码>是指针,则(A- > Val< B-> Val] {}} /C++ >简单地翻译为(A.ValuaB.Valman){}} /

我正在构建一些测试代码,并尝试将指针与
运算符进行比较。我的目标是将元素排序到一个平衡的树结构中(由我实现)。为此,我需要快速、通用的比较。遵循古老的C/C++习惯,我现在的想法是(…在写这篇文章时是)通过指针地址来比较它们

然而,正如我发现的,它不起作用。源头

if (&(a.val) < &(b.val)) {
if(&(a.val)<&(b.val)){
给出编译错误

./pointer.go:40:无效操作:&a.val<&b.val(运算符<未在指针上定义)

a
b
是将
val
作为(安全)指针成员的结构

可以比较围棋中的安全指针吗?如何比较

是否可以保证指针的顺序保持不变?(例如,我可以想象一些GC技巧也会对数据进行重新排序。)

是否保证指针的顺序保持不变 例如,我可以想象一些GC技巧也会对数据进行重新排序。)

在回答这部分问题时,它看起来不像。请参阅下面链接的pkg不安全

如果需要指针的内存地址,请尝试使用不安全的软件包:

主程序包
进口(
“fmt”
“不安全”
)
func main(){
变量a,b int
变量pa,pb*int
pa=&a
pb=&b
//变量c int
//pa=&c
如果uintptr(不安全的指针(pa))b:%p”,pa,pb)
}否则{
fmt.Printf(“b:%p>a:%p”,pb,pa)
}
}
这将使您获得任意指针类型,然后是该指针的当前内存地址(如printf所示)。但请注意此处的注意事项,您不能依赖此地址:

将指针转换为uintptr将生成 作为整数指向的值。此类UINTPTTR的通常用法是 将uintptr转换回指针在中无效 常规。uintptr是整数,而不是引用。转换 指向uintptr的指针创建一个没有指针的整数值 即使uintptr持有某个对象的地址 如果对象 移动,uintptr也不会阻止对象被回收


这绕过了Go类型系统和内存安全性,因此它是不安全的,您可能不想这样做,除非您只是在试验。我想不出在测试中这样做的理由,但如果您想确保阅读整个文档,并且非常确定您知道您正在做的事情将按预期工作。

这里没有指针算法。指针
a
小于指针
b
的含义是什么?内存地址小于另一个内存地址有什么可能的信息?是的,您可以通过数字或十六进制字符串获得地址,这不是问题所在。这是指针值本身比较没有意义当你得到的答案几乎是随机的时,你为什么要关心两个值的顺序呢?如果没有指针算法,指针指向的特定地址的信息是毫无意义的。在C(我假设C++)中,指针只能在两个指针指向同一数组时进行比较(指针之间的所有比较都是未定义的)。在C++中,如果<代码> <代码> >代码> b>代码>是指针,则<代码>(A- > Val< B-> Val] {}} /C++ >简单地翻译为<代码>(A.ValuaB.Valman){}} /Go.>在GO中。@ KRISS我实现了一个通用AVL树,并且我希望这个是默认的比较函数。对指针进行比较是有用的。我当时不知道在GO中分配的内存地址可以改变。后来我了解到了,并且我使用了C++的抽象类来实现它。我不喜欢默认的GO库,从第一个时刻开始,特别是它的哈希实现,并且它硬连接到了。语言语法,因为我认为它是VLQ。基于这些原因,后来我停止使用Go。我没有建议不安全:)我认为有时候它是值得解释为什么不安全的,以及如何去做它,这样人们可以做出明智的决定……也许也会对GO记忆模型有所了解。
package main

import (
    "fmt"
    "unsafe"
)

func main() {
    var a,b int
    var pa,pb *int
    pa = &a
    pb = &b

    //var c int
    //pa = &c

    if uintptr(unsafe.Pointer(pa)) < uintptr(unsafe.Pointer(pb)) {
      fmt.Printf("a:%p > b:%p",pa,pb)   
    } else {
      fmt.Printf("b:%p > a:%p",pb,pa)
    }

}