3 回答
TA贡献1810条经验 获得超4个赞
package main
import "fmt"
func main() {
i := 32
j := 32
fmt.Printf("%p is %p\n", &i, &i)
fmt.Printf("%p is not %p\n", &i, &j)
}
输出:
0xc000016100 is 0xc000016100
0xc000016100 is not 0xc000016108
游乐场:https://play.golang.org/p/nXAEJeImeXa
然而,
package main
import "fmt"
func main() {
i := 32
j := 32
fmt.Printf("i %p is i %p; i == i %t\n", &i, &i, &i == &i)
fmt.Printf("i %p is not j %p; i == j %t\n", &i, &j, &i == &j)
fmt.Println()
var v struct {
i struct{}
j struct{}
}
fmt.Printf("i %p is i %p; i == i %t\n", &v.i, &v.i, &v.i == &v.i)
fmt.Printf("i %p is not j %p; i == j %t\n", &v.i, &v.j, &v.i == &v.j)
}
输出:
i 0x40e020 is i 0x40e020; i == i true
i 0x40e020 is not j 0x40e024; i == j false
i 0x1e52bc is i 0x1e52bc; i == i true
i 0x1e52bc is not j 0x1e52bc; i == j true
游乐场:https://play.golang.org/p/Wv814ZgPCul
封装CMP
import "github.com/google/go-cmp/cmp"cmp 包确定值的相等性。
该包旨在成为 Reflect.DeepEqual 的更强大、更安全的替代方案,用于比较两个值在语义上是否相等。
TA贡献1825条经验 获得超4个赞
使用 CPython,id返回内存中对象的地址。在 Go 中,您可以通过 & 符号获取指向对象的指针:
package main
import "fmt"
func main() {
i := 32
j := 32
fmt.Printf("%p is %p\n", &i, &i)
fmt.Printf("%p is not %p\n", &i, &j)
}
上面示例的输出在我的机器上如下所示:
0xc000016100 is 0xc000016100
0xc000016100 is not 0xc000016108
TA贡献1828条经验 获得超3个赞
您可以用来DeepEqual
比较两个对象的内容。但是,我不认为 python 就是id
这么做的。从 python 中的定义来看id
,您所追求的似乎是指针等效,而不是DeepEqual
. id
状态的函数定义
这是一个整数,保证该对象在其生命周期内是唯一且恒定的。
如果要比较两个指针值,则可以简单地使用==
:如果两个指针指向同一对象,则它们相等。如果两个指针值不相等,它们仍然可能指向具有相同内容的对象,因此p1==p2
可能为假,但DeepEqual(*p1,*p2)
也可能为真。
- 3 回答
- 0 关注
- 132 浏览
添加回答
举报