Gitmek için yeniyim ve otomatik değişkenlerin yığın üzerinde yaşadığı ve ayrılan belleğin yığın üzerinde yaşadığı C stili yığın tabanlı programlama ile burada Python tarzı yığın tabanlı programlama yığın üzerinde yaşayan tek şey öbek üzerindeki nesnelere referanslar / işaretçilerdir.
Anlayabildiğim kadarıyla, aşağıdaki iki fonksiyon aynı çıktıyı verir:
func myFunction() (*MyStructType, error) {
var chunk *MyStructType = new(HeaderChunk)
...
return chunk, nil
}
func myFunction() (*MyStructType, error) {
var chunk MyStructType
...
return &chunk, nil
}
yani yeni bir yapı tahsis edin ve geri gönderin.
Bunu C'de yazsaydım, birincisi öbeğe bir nesne ve ikincisi yığına koyardı. Birincisi yığına bir işaretçi döndürür, ikincisi yığına bir işaretçi döndürür, bu da işlevin döndüğü zaman buharlaşırdı, ki bu kötü bir şey olurdu.
Python (veya C # dışında birçok modern dilde) yazsaydım, örnek 2 mümkün olmazdı.
Go çöpünün her iki değeri de topladığını anlıyorum, bu yüzden yukarıdaki formların ikisi de iyi.
Alıntılamak:
C'den farklı olarak, yerel bir değişkenin adresini döndürmenin mükemmel olduğunu unutmayın; değişkenle ilişkili depolama, işlev döndükten sonra da devam eder. Aslında, bileşik bir değişmezin adresini almak her değerlendirildiğinde yeni bir örnek tahsis eder, böylece bu son iki satırı birleştirebiliriz.
Ama birkaç soru ortaya çıkarıyor.
1 - Örnek 1'de, yapı yığın üzerinde bildirilmiştir. Örnek 2 ne olacak? Bu, yığında C ile aynı şekilde mi bildirilir yoksa öbeye de gider mi?
2 - Yığın üzerinde örnek 2 bildirilirse, işlev döndükten sonra nasıl kullanılabilir kalır?
3 - Örnek 2 gerçekten öbek üzerinde bildirilirse, yapıların referanstan ziyade değere göre aktarılması nasıl olur? Bu durumda işaretçiler ne anlama geliyor?