这是我正在尝试编写的现实世界代码的一部分。问题是Go复制了接口sibling所以我不能修改数据。但是,如果我改为使用指向接口的指针,那么相等的概念就失败了。我知道我可以使用DeapEquals,但不能在地图中使用。package mainimport ( "fmt")type Q interface { modify()}type P struct { name string sibling Q}func (x P) modify() { x.name = "a"}func main() { a := P{"a", nil} A := P{"?", nil} b := P{"b", a} B := P{"b", A} B.sibling.modify() fmt.Println(B) fmt.Println(b == B)}如何让 Go 允许我修改接口数据本身而不复制它和修改副本?似乎这些在结构上是互斥的:我需要能够使用地图我需要能够使用方法修改接口数据
2 回答
翻翻过去那场雪
TA贡献2065条经验 获得超14个赞
修改数据而不复制数据的唯一方法是使用指针。
我对您所说的内容感到有些困惑,因为您的示例使用了结构并且您谈论了结构,但是您说您需要能够使用地图。无论哪种方式,DeepReflect 都适用于两者。这是您修改为使用指针的示例:
package main
import (
"fmt"
"reflect"
)
type Q interface {
modify()
}
type P struct {
name string
sibling Q
}
func (x *P) modify() {
x.name = "a"
}
func main() {
a := P{"a", nil}
A := P{"?", nil}
b := P{"b", &a}
B := P{"b", &A}
B.sibling.modify()
fmt.Println("a:", a)
fmt.Println("A:", A)
fmt.Println("b:", b)
fmt.Println("B:", B)
fmt.Println(b == B)
fmt.Println(reflect.DeepEqual(b, B))
}
印刷:
a: {a <nil>}
A: {a <nil>}
b: {b 0x10436180}
B: {b 0x10436190}
false
true
你可以看到这篇文章对地图做同样的事情。
- 2 回答
- 0 关注
- 165 浏览
添加回答
举报
0/150
提交
取消