如何知道 2 个 go maps 是否引用相同的数据
How to know if 2 go maps reference the same data
Go 地图是对内部数据的引用。这意味着当地图为 "copied" 时,它们最终共享相同的引用并因此编辑相同的数据。这与具有相同项目的另一张地图截然不同。但是,我找不到任何方法来区分这两种情况。
import "fmt"
import "reflect"
func main() {
a := map[string]string{"a": "a", "b": "b"}
// b references the same data as a
b := a
// thus editing b also edits a
b["c"] = "c"
// c is a different map, but with same items
c := map[string]string{"a": "a", "b": "b", "c": "c"}
reflect.DeepEqual(a, b) // true
reflect.DeepEqual(a, c) // true too
a == b // illegal
a == c // illegal too
&a == &b // false
&a == &c // false too
*a == *b // illegal
*a == *c // illegal too
}
有什么解决办法吗?
使用反射包将地图作为指针进行比较:
func same(x, y interface{}) bool {
return reflect.ValueOf(x).Pointer() == reflect.ValueOf(y).Pointer()
}
在问题的地图上这样使用:
fmt.Println(same(a, b)) // prints true
fmt.Println(same(a, c)) // prints false
Go 地图是对内部数据的引用。这意味着当地图为 "copied" 时,它们最终共享相同的引用并因此编辑相同的数据。这与具有相同项目的另一张地图截然不同。但是,我找不到任何方法来区分这两种情况。
import "fmt"
import "reflect"
func main() {
a := map[string]string{"a": "a", "b": "b"}
// b references the same data as a
b := a
// thus editing b also edits a
b["c"] = "c"
// c is a different map, but with same items
c := map[string]string{"a": "a", "b": "b", "c": "c"}
reflect.DeepEqual(a, b) // true
reflect.DeepEqual(a, c) // true too
a == b // illegal
a == c // illegal too
&a == &b // false
&a == &c // false too
*a == *b // illegal
*a == *c // illegal too
}
有什么解决办法吗?
使用反射包将地图作为指针进行比较:
func same(x, y interface{}) bool {
return reflect.ValueOf(x).Pointer() == reflect.ValueOf(y).Pointer()
}
在问题的地图上这样使用:
fmt.Println(same(a, b)) // prints true
fmt.Println(same(a, c)) // prints false