Почему Значения карты не адресуются?

играя с кодом Go, я обнаружил, что Значения карты не адресуются. Например,

package main
import "fmt"

func main(){
    var mymap map[int]string = make(map[int]string)
    mymap[1] = "One"
    var myptr *string = &mymap[1]
    fmt.Println(*myptr)
}

выдает ошибку

mapaddressable.go: 7: не удается взять адрес mymap[1]

в то время, кода

package main
import "fmt"

func main(){
    var mymap map[int]string = make(map[int]string)
    mymap[1] = "One"
    mystring := mymap[1]
    var myptr *string = &mystring
    fmt.Println(*myptr)
}

работает прекрасно.

Почему это так? Почему разработчики Go решили сделать некоторые значения не адресуемыми? Является ли это недостатком или особенностью язык?

редактировать: Будучи из фона C++, я не привык к этому not addressable тенденция, которая, кажется, распространена в Go. Например, следующий код работает просто отлично:

#include<iostream>
#include<map>
#include<string>
using namespace std;
int main(){
    map<int,string> mymap;
    mymap[1] = "one";
    string *myptr = &mymap[1];
    cout<<*myptr;
}

было бы здорово, если бы кто-нибудь мог указать, почему то же самое адресуемость не может быть достигнуто (или намеренно не было достигнуто) в Go.

1 ответов


Ну, я не знаю о внутренней реализации Go карт, но, скорее всего, это своего рода хэш-таблица. Поэтому, если вы берете и сохраняете адрес одной из его записей, а затем помещаете в нее другую кучу записей, ваш сохраненный адрес может быть недействительным. Это связано с внутренней реорганизацией хэш-таблиц, когда коэффициент загрузки превышает определенный порог и хэш-таблица должна расти.
Поэтому я думаю, что не разрешается брать адрес одной из его записей по порядку чтобы избежать таких ошибок.