Почему go запрещает брать адрес (&) члена карты, но разрешает (&) элемент фрагмента?

Go не позволяет получить адрес участника карты:

// if I do this:
p := &mm["abc"]
// Syntax Error - cannot take the address of mm["abc"]

Логическое обоснование состоит в том, что если Go разрешает брать этот адрес, когда хранилище карты увеличивается или сверкает, адрес может стать недействительным, что вводит пользователя в заблуждение.

Но слайс Go перемещается, когда его объем превышает его, однако Go позволяет нам получить адрес элемента слайса:

 a := make([]Test, 5)
 a[0] = Test{1, "dsfds"}
 a[1] = Test{2, "sdfd"}
 a[2] = Test{3, "dsf"}

 addr1 := reflect.ValueOf(&a[2]).Pointer()
 fmt.Println("Address of a[2]: ", addr1)

 a = append(a, Test{4, "ssdf"})
 addrx := reflect.ValueOf(&a[2]).Pointer()
 fmt.Println("Address of a[2] After Append:", addrx)

 // Note after append, the first address is invalid
 Address of a[2]:  833358258224
 Address of a[2] After Append: 833358266416

Почему Go разработан так? Что особенного в получении адреса элемента слайса?

Ответы на вопрос(2)

Ваш ответ на вопрос