2016-08-23 11 views
2

Ich bin ziemlich neu zu Golang und kompilierte Sprachen im Allgemeinen, also entschuldigen Sie bitte meine Ignoranz. In einigen Code wie folgt:Was ist der Unterschied zwischen der Variablenzuweisung und der Referenzübergabe?

... Was ist der praktische Unterschied zwischen dem Zuweisen des Werts zu einem vs. Passing b by reference?

In Bezug auf Real-World-Code, warum json.Unmarshal() erfordert, dass Sie einen Zeiger auf Ihre leere Variable übergeben, anstatt nur den Unmarshalled-Wert zurückgeben, damit Sie es Ihrer Variablen zuweisen können?

+0

Go „als Wert übergeben.“ Also nimmt die Referenzfunktion einen Zeiger auf eine ganze Zahl, die zufällig ein Referenzwert ist. Sie müssen auch in dieser Funktion nichts zurückgeben. – squiguy

Antwort

0

Das Übergeben von Wert erfordert das Kopieren von Parametern, aber im Falle einer Referenz senden Sie einfach den Zeiger an das Objekt. Golang wird standardmäßig als Wert übergeben, auch für Slices.

Für die spezifische Frage über json.Unmarshal, glaube ich, der Grund ist, so dass der Unmarshal-Code überprüfen kann, ob das übergebene Objekt enthält die gleichen Feldnamen mit kompatiblen Typen wie in der JSON gefunden. Zum Beispiel, wenn JSON ein wiederholtes Feld hat, muss es eine entsprechende Scheibe in dem Objekt geben, in das wir entpacken.

Also, müssen wir in der Struktur übergeben, die wir die JSON-String in unmarshal in wollen. Es muss ein Zeiger sein, damit Unmarshal die Felder füllen kann. Wenn Sie nur eine generische Schnittstelle übergeben, gibt Unmarshal eine Karte zurück. Wenn Unmarshal keinen Zeiger auf eine Struktur/Schnittstelle genommen hat, könnte es implementiert worden sein, um immer eine Karte zurückzugeben, aber ich denke, dass es auf diese Weise nützlicher ist.

Dies ist ein einfaches Beispiel, aber nützlich sein könnte - https://play.golang.org/p/-n8euepSS0

+0

Ah, ich verstehe. Ich habe nicht daran gedacht, einen bestimmten Typ an json.Unmarshal() zu übergeben und den Rückgabewert zu "filtern". In allen Beispielen, die ich bisher gesehen habe, hat alles nur eine Schnittstelle {} verwendet, um alle Attribute in JSON zu erfassen. Wohingegen, wenn die Methode den JSON analysierte und es zurückgab, Sie nicht die Wahl hätten. – Marc

+0

"Golang wird standardmäßig als Wert übergeben, auch für Slices." - Das stimmt, aber es ist ein wenig komplizierter, weil das Segment selbst einen Zeiger auf die Daten enthält, so dass es als Referenztyp dient, z. Sie können die Elemente auch ändern, wenn sie als Wert übergeben werden: https://play.golang.org/p/XmmeiCkRYy Aber abhängig von der Kapazität kann das Anhängen funktionieren oder nicht (da append den Zeiger möglicherweise so verändert, dass er auf einen neuen Speicher verweist Standort): https://blog.golang.org/go-slices-usage-and-internals [https://blog.golang.org/slices#TOC_4.](https://blog.golang.org/slices # TOC_4.) – user1431317

Verwandte Themen