Wenn wir in der C-Sprache eine Struktur anstelle eines Zeigers auf die Struktur zurückgeben, liegt der Grund dafür, dass wir den Wert nicht direkt zuweisen können, darin, dass bei der Rückgabe der Struktur der Inhalt der gesamten Struktur kopiert wird, anstatt den zurückzugeben Zeiger auf den Strukturkörperzeiger. Da eine Struktur eine große Datenmenge enthalten kann, kann das Kopieren der gesamten Struktur teuer sein. Um die Effizienz zu verbessern, schreibt die C-Sprache daher vor, dass wir eine Struktur bei der Rückgabe nur verwenden können, indem wir sie einer Variablen vom Strukturtyp zuweisen. Dadurch können unnötige Kopiervorgänge vermieden und die Effizienz der Codeausführung verbessert werden.
Angenommen, wir haben die folgende Struktur
type profile struct { id int name string } func test(p profile) profile { return p } func main() { var profile profile test(profile).id = 20 // cannot assign to test(profile).id (value of type int) }
Aber wenn wir den Rückgabetyp der Funktion testen profile
更改为 *profile
, funktioniert die Hauptfunktion.
func test(p Profile) *Profile { return &p } func main() { var profile Profile test(profile).id = 20 // Works }
Warum passiert das?
Das Zuweisen von Feldern zu Profile
auf diese Weise hat keine spürbaren Auswirkungen. Sie weisen einen temporären Strukturwert (eines Felds) zu und verwerfen ihn dann sofort. Beachten Sie, dass der Rückgabewert des Tests eine Kopie des Profils in main ist; er wird in die Parameter des Tests kopiert und dann erneut kopiert, wenn Sie vom Test zurückkehren.
Wenn ein Zeiger zurückgegeben wird, ist die Struktur, auf die gezeigt wird, zumindest im Prinzip nach der Zuweisung immer noch zugänglich (allerdings nicht in diesem speziellen Fall, da der Zeiger auf eine Kopie des getesteten Arguments zeigt).
Das obige ist der detaillierte Inhalt vonWarum können wir keinen Wert zuweisen, wenn wir eine Struktur anstelle eines Zeigers auf eine Struktur zurückgeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!