Sono nuovo di Go e sto sperimentando un po 'di dissonanza congestiva tra la programmazione basata sullo stack in stile C in cui le variabili automatiche vivono nello stack e la memoria allocata vive nell'heap e la programmazione basata sullo stack in stile Python in cui il l'unica cosa che vive nello stack sono riferimenti / puntatori agli oggetti nell'heap.
Per quanto ne so, le due seguenti funzioni danno lo stesso output:
func myFunction() (*MyStructType, error) {
var chunk *MyStructType = new(HeaderChunk)
...
return chunk, nil
}
func myFunction() (*MyStructType, error) {
var chunk MyStructType
...
return &chunk, nil
}
cioè allocare una nuova struttura e restituirla.
Se lo avessi scritto in C, il primo avrebbe messo un oggetto nell'heap e il secondo l'avrebbe messo in pila. Il primo avrebbe restituito un puntatore all'heap, il secondo avrebbe restituito un puntatore allo stack, che sarebbe evaporato al momento del ritorno della funzione, che sarebbe una cosa negativa.
Se l'avessi scritto in Python (o in molte altre lingue moderne tranne C #), l'esempio 2 non sarebbe stato possibile.
Ho capito che Go Garbage raccoglie entrambi i valori, quindi entrambi i moduli sopra vanno bene.
Per citare:
Si noti che, a differenza di C, è perfettamente OK restituire l'indirizzo di una variabile locale; la memoria associata alla variabile sopravvive dopo il ritorno della funzione. In effetti, prendere l'indirizzo di un letterale composito alloca una nuova istanza ogni volta che viene valutato, quindi possiamo combinare queste ultime due righe.
Ma solleva un paio di domande.
1 - Nell'esempio 1, la struttura è dichiarata nell'heap. Che dire dell'esempio 2? È dichiarato nello stack nello stesso modo in cui verrebbe in C o va anche nell'heap?
2 - Se l'esempio 2 viene dichiarato nello stack, come rimane disponibile dopo il ritorno della funzione?
3 - Se l'esempio 2 viene effettivamente dichiarato sull'heap, come mai le strutture vengono passate per valore anziché per riferimento? Qual è il punto di puntatori in questo caso?