Git bir harita üyesinin adresini alarak izin vermez:Neden (&) harita üyesinin adresini almayı yasaklıyorsunuz, ancak (&) dilim öğesine izin veriyorsunuz?
// if I do this:
p := &mm["abc"]
// Syntax Error - cannot take the address of mm["abc"]
mantığı git bu adresi alarak verir eğer haritası backstore büyür veya shinks zaman, adres ve kullanıcıyı şaşırtabilir geçersiz hale olmasıdır .
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
Geçiş Neden böyle tasarlanmıştır:
Ama git dilim onun kapasitesini içinde büyüyor, henüz Git bir dilim elemanının adresini almamızı izin verdiğinde taşındı alır? Dilim elemanının adresinin alınmasıyla ilgili özel olan nedir?
Bunu okuyun: [Git: Diziler ve haritalar farklı kavramlar/özellikler mi olmalı?] (Http://stackoverflow.com/questions/25294290/go-do-arrays-and-maps-have-to-be -farklı-kavramlar-özellikler – icza
Ne yazık ki, bir dilim öğesinin adresini alma konusunda hiçbir şey özel değildir - eğer dilim büyüdükten sonra bu ilk adresi kullanmaya devam ederseniz ('kodunu çalıştırmak yerine '& a [2]' yeniden post-' append ', yaptığınız gibi, hala eski diziye işaretçiniz olacak, böylece yeni diziyi görmek veya güncellemek için kullanamazsınız, ve eski diziye hala ulaşılabilir ve çöp değil - koleksiyon. Harita için – twotwotwo
düzeltme adresi dizisi için adres sabitleme daha zor olduğunu düşünüyorum. –