【发布时间】:2017-11-19 15:14:50
【问题描述】:
我正在构建一些测试代码,并尝试将指针与<、> 运算符进行比较。我的目标是将元素排列成一个平衡的树结构(由我实现)。为此,我需要快速、通用的比较。遵循古老的 C/C++ 习惯,我目前的想法是(...在撰写本文时)通过指针地址来比较它们。
但是,正如我发现的那样,它不起作用。来源
if (&(a.val) < &(b.val)) {
给出编译错误
./pointer.go:40: 无效操作: &a.val
a 和 b 是带有 val 作为(安全)指针成员的结构。
是否可以在 go 中比较安全指针?怎么样?
是否保证指针的顺序保持不变? (例如,我可以想象一些 GC 诡计也会对数据进行重新排序。)
【问题讨论】:
-
Go 中没有指针运算。指针
a小于指针b是什么意思?它有什么可能的信息表明一个内存地址小于另一个? -
是的,您可以将地址作为数字或十六进制字符串获取,这不是问题。就是比较指针值本身没有意义。
-
当你得到的答案几乎是随机的时,你为什么要关心两个值的顺序?如果没有指针运算,指针指向的特定地址的信息是没有意义的。在 C(我假设是 C++)中,只有当两个指针指向同一个数组时才能比较指针(指针之间的所有其他比较都是未定义的)。
-
在 C++ 中,如果
a和b是指针,那么if (a->val < b->val) { ... }在 Go 中简单地转换为if (a.val < b.val) { ... }。 -
@kriss 我实现了一个通用的 AVL 树,我想要这个作为默认比较函数。我坚持(来自 C++)比较指针会很有用。我当时不知道分配的内存地址可以在 Go 中改变。后来我知道了,我使用 C++ 抽象类的等价物来实现它。我从一开始就不喜欢默认的 go 库,尤其是它的哈希实现,并且它被硬连接到语言语法中,因为我认为它是 VLQ。由于这些原因,后来我不再使用 Go。
标签: pointers go comparison