Почему я не могу установить значение карты для переменной?

Я так смущен структурой данных карты в Go. Позвольте мне прояснить, я понимаю это, когда я сделаю следующее.

m:= make([строка]int)

m на самом деле является указателем на runtimes.HashMap в Golang. Хотя это и не похоже, на самом деле это переменная-указатель. Однако предположим, что у меня есть следующий код. В приведенном ниже коде создается карта, содержащая начальный и конечный индексы каждого символа в строке. например, map [a] = Tuple{0, 6}

type Tuple struct {
    i int
    j int
}

type tupleMap  map[string]Tuple

a := "abcbfsagduisjgjxyx"
m := tupleMap{}

for index, c := range a {
    if _, ok := m[string(c)]; !ok {
        m[string(c)] = Tuple{index, index}
    } else {
        //this line below has error `cannot assign to struct field m[string(c)].j in map compiler`
        m[string(c)].j = index 
        //If I want to assign index to j, I have to do the following...
        entry := m[string(c)]
        entry.j = index
        m[string(c)] = entry
    }
}

m[строка (c)].j = index приводит к ошибке компиляции. Мне нужно сделать это за 3 шага. Почему это?

Однако, если я указываю значение карты как &Tuple, оно работает отлично. Пожалуйста, посмотрите на код ниже:

type Tuple struct {
    i int
    j int
}

type tupleMap  map[string]*Tuple

a := "abcbfsagduisjgjxyx"
m := tupleMap{}

for index, c := range a {
    if _, ok := m[string(c)]; !ok {
        m[string(c)] = &Tuple{index, index}
    } else {
        //this works fine.
        m[string(c)].j = index 
    }
}

Я так запуталась, пожалуйста, укажите мне правильное направление. Пока я читал язык программирования Go, написанный Брайаном Керниганом, они упомянули, что элемент карты не является переменной, и мы не можем получить его адрес. поэтому _:= &map["a"] будет ошибкой компиляции. Причина в том, что увеличение карты может вызвать перехеширование существующих элементов в новые места хранения, что потенциально может сделать адрес недействительным.

0 ответов

Другие вопросы по тегам