Jak słusznie wspomniano w wielu innych odpowiedziach tutaj i gdzie indziej, ResponseWriterinterfejs, a jego konsekwencje zostały szczegółowo opisane w odpowiedziach SO i na blogach.
Chciałabym odnieść się do tego, co uważam za duże - i niebezpieczne - błędne przekonanie, że powód żądania jest przekazywany przez „odniesienie” (chociaż coś takiego nie istnieje w Go ) jest takie, że „chcemy wprowadzić zmiany widoczne dla serwera ”.
Cytując kilka odpowiedzi:
[..] to tylko struktura, a ponieważ chcemy zmienić tę strukturę i pozwolić serwerowi WWW zobaczyć te zmiany, musi to być wskaźnik [..] SO
[..] zmiany żądania przez procedurę obsługi muszą być widoczne dla serwera, więc przekazujemy je tylko przez odwołanie, a nie przez wartość [..] SO
To jest złe ; w rzeczywistości dokumenty wyraźnie ostrzegają przed manipulowaniem / modyfikowaniem żądania :
Z wyjątkiem czytania treści, osoby obsługujące nie powinny modyfikować dostarczonego Request.
Wręcz przeciwnie, nie? :-)
Jeśli chcesz zmienić żądanie, np. Dołączyć nagłówek śledzenia przed przekazaniem go do następnego programu obsługi w łańcuchu oprogramowania pośredniego , musisz skopiować żądanie i przekazać skopiowaną wersję w dół łańcucha.
Żądania zmiany zachowania, aby umożliwić modyfikacje przychodzącego żądania , zostały zgłoszone przez zespół Go, ale zmiana czegoś takiego prawdopodobnie doprowadziłaby do nieoczekiwanego uszkodzenia przynajmniej części istniejącego kodu.
Po co używać wskaźnika, jeśli wyraźnie mówimy ludziom, aby nie modyfikowali żądania? Wydajność , Requestjest duża struktura i kopiowanie może przynieść wyniki w dół, zwłaszcza z długich łańcuchów middleware w umyśle. Zespół musiał znaleźć równowagę, zdecydowanie nie jest to idealne rozwiązanie, ale kompromisy są tutaj wyraźnie po stronie wydajności (zamiast bezpieczeństwa API).