Das http.ResponseWriter
ist eine Schnittstelle, und die vorhandenen Typen, die diese Schnittstelle implementieren, sind Zeiger. Das bedeutet, dass kein Zeiger auf diese Schnittstelle verwendet werden muss, da dieser bereits von einem Zeiger "unterstützt" wird. Dieses Konzept ist ein wenig von einem des Go Entwicklers startet beschreiben hier zwar eine Art der Umsetzung http.ResponseWriter brauchte keinen Zeiger zu sein, wäre es nicht sinnvoll sein, zumindest nicht innerhalb unterwegs http - Servers.
http.Request
ist keine Schnittstelle, sondern nur eine Struktur. Da wir diese Struktur ändern möchten und der Webserver diese Änderungen sehen soll, muss es sich um einen Zeiger handeln. Wenn es nur ein Strukturwert wäre, würden wir nur eine Kopie davon ändern, die der Webserver, der unseren Code aufruft, nicht sehen konnte.
Wie in vielen anderen Antworten hier und anderswo richtig erwähnt,
ResponseWriter
handelt es sich um eine Schnittstelle, deren Auswirkungen in SO- Antworten und Blogs ausführlich beschrieben wurden .Was ich ansprechen möchte, ist meiner Meinung nach das große - und gefährliche - Missverständnis hier, dass die Grundanforderung als "Referenz" übergeben wird (obwohl so etwas in Go nicht wirklich existiert ), dass "wir Änderungen vornehmen wollen dazu sichtbar für den Server ".
Ein paar Antworten zitieren:
Das ist falsch ; Tatsächlich warnen die Dokumente ausdrücklich davor, die Anfrage zu manipulieren oder zu mutieren :
Im Gegenteil, nein? :-)
Wenn Sie die Anforderung ändern möchten, z. B. einen Ablaufverfolgungsheader anhängen, bevor Sie ihn an den nächsten Handler in einer Middleware-Kette weiterleiten, müssen Sie die Anforderung kopieren und die kopierte Version an die Kette weitergeben.
Anfragen um das Verhalten zu ändern Änderungen der eingehenden Anforderung zu ermöglichen , erhoben wurden mit dem Go - Team aber zumindest einig vorhandener Code wahrscheinlich führen würden wie folgt zu ändern unerwartet brechen.
Warum einen Zeiger verwenden, wenn wir den Leuten ausdrücklich sagen, dass sie die Anfrage nicht mutieren sollen? Performance ,
Request
ist eine große Struktur und Kopieren kann Leistung bringen, vor allem bei langen Middleware - Ketten im Auge behalten. Das Team musste ein Gleichgewicht finden, definitiv keine ideale Lösung, aber die Kompromisse sind hier eindeutig auf der Seite der Leistung (anstelle der API-Sicherheit).quelle
Der Grund, warum es sich um einen Zeiger auf Request handelt, ist einfach: Änderungen an Request durch den Handler müssen für den Server sichtbar sein, sodass wir sie nur als Referenz und nicht als Wert übergeben.
Wenn Sie sich in den Code der net / http-Bibliothek vertiefen, werden Sie feststellen, dass ResponseWriter eine Schnittstelle zu einer nicht exportierten Strukturantwort ist, und wir übergeben die Struktur als Referenz (wir übergeben einen Zeiger auf die Antwort) und nicht als Wert . ResponseWriter ist eine Schnittstelle, über die ein Handler eine HTTP-Antwort erstellt. Die eigentliche Struktur, die ResponseWriter sichert, ist die nicht exportierte Struktur http.response. Da es nicht exportiert wird, können Sie es nicht direkt verwenden. Sie können es nur über die ResponseWriter-Schnittstelle verwenden.
Mit anderen Worten, beide Parameter werden als Referenz übergeben; Es ist nur so, dass die Methodensignatur einen ResponseWriter verwendet, der eine Schnittstelle zu einem Zeiger auf eine Struktur darstellt. Es sieht also so aus, als ob er als Wert übergeben wird.
quelle
Ich denke, dass der Hauptgrund für die
Request
Übergabe des Objekts als Zeiger dasBody
Feld ist. Für eine bestimmte HTTP-Anfrage kann der Text nur einmal gelesen werden. Wenn dasRequest
Objekt geklont würde, wie es wäre, wenn es nicht als Zeiger übergeben würde, hätten wir zwei Objekte mit unterschiedlichen Informationen darüber, wie viel aus dem Körper gelesen wurde.quelle