Go не позволяет брать адрес члена карты:
// if I do this:
p := &mm["abc"]
// Syntax Error - cannot take the address of mm["abc"]
Обоснование заключается в том, что если Go позволяет принимать этот адрес, когда база backstore растет или загорается, адрес может стать недействительным, запутать пользователя.
Но кусок 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 спроектирован так? Что особенного в адресе элемента среза?