Как сравнить идентичность карт ИЛИ что происходит в этом примере? - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь сравнить идентичность 2 карт

package main

import "fmt"

func main() {
    a := map[int]map[int]int{1:{2:2}}

    b := a[1]
    c := a[1]

    // I can't do this: 
    // if b == c
    // because I get: 
    // invalid operation: b == c (map can only be compared to nil)

    // but as far as I can tell, mutation works, meaning that the 2 maps might actually be identical
    b[3] = 3

    fmt.Println(c[3]) // so mutation works...


    fmt.Printf("b as pointer::%p\n", b)
    fmt.Printf("c as pointer::%p\n", c) 

    // ok, so maybe these are the pointers to the variables b and c... but still, those variables contain the references to the same map, so it's understandable that these are different, but then I can't compare b==c like this
    fmt.Printf("&b::%p\n", &b)
    fmt.Printf("&c::%p\n", &c)  

    fmt.Println(&b == &c)
}

, это дает следующий результат:

3
b as pointer::0x442280
c as pointer::0x442280
&b::0x40e130
&c::0x40e138
false

Что меня особенно смущает, так это то, что b as pointer::0x442280 иc as pointer::0x442280 кажется, имеют те же значения, что действительно подтвердило бы мое подозрение, что эти переменные так или иначе указывают на один и тот же диктат.

Так кто-нибудь знает, как я могу заставить себя сказать, что b иc "один и тот же объект"?

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Не красиво, но вы можете использовать reflect.ValueOf(b).Pointer():

package main

import (
    "fmt"
    "reflect"
)

func main() {
    a := map[int]map[int]int{1: {2: 2}}

    b := a[1]
    c := a[1]

    d := map[int]int{2: 2}

    fmt.Println(reflect.ValueOf(b).Pointer() == reflect.ValueOf(c).Pointer())
    fmt.Println(reflect.ValueOf(c).Pointer() == reflect.ValueOf(d).Pointer())
}
0 голосов
/ 25 октября 2018

Хорошо, так что я, очевидно, плохо знаком с языком, и я не стану так скоро его критиковать, но вот решение, которое я нашел:

Код Python:

obj1 is obj2

Javascript код:

obj1 === obj2  // for objects, which is what I care about

Java-код:

obj1 == obj2

И еще есть код:

fmt.Sprintf("%p", obj1) == fmt.Sprintf("%p", obj2)

Да, именно так это и выглядит:Я получаю строковое представление указателей на 2 переменные и сравниваю их.И строки выглядят так: 0x442280.

fmt.DeepEqual - не решение для меня, потому что

  1. проверяет, равны ли указатели, а затем
  2. Затем он проверяет, равны ли значения на карте

Это совсем не то, что я хочу.Я хочу знать только, являются ли карты абсолютно одинаковыми объектами, не содержат ли они одинаковые значения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...