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