Почему я не могу установить значение карты для переменной?
Я так смущен структурой данных карты в 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"] будет ошибкой компиляции. Причина в том, что увеличение карты может вызвать перехеширование существующих элементов в новые места хранения, что потенциально может сделать адрес недействительным.