Як правильно згадувалось у багатьох інших відповідях тут та в інших місцях, ResponseWriter
це інтерфейс, і наслідки цього були детально описані у відповідях та блогах SO .
Я хотів би звернутися до того, що, на мою думку, тут є велике і небезпечне помилкове уявлення про те, що запит про причину передається за допомогою "посилання" (хоча такого в насправді не існує в Go ) полягає в тому, що "ми хочемо внести зміни йому видиме серверу ".
Процитувавши пару відповідей:
[..] це просто структура, і оскільки ми хочемо змінити цю структуру і щоб веб-сервер бачив ці зміни, це повинен бути вказівник [..] ТАК
[..] зміни в Запит обробником повинні бути видимими для сервера, тому ми передаємо їх лише за посиланням, а не за значенням [..] SO
Це неправильно ; насправді документи прямо застерігають від фальсифікації / мутації запиту :
За винятком читання тексту, обробники не повинні змінювати наданий Запит.
Зовсім навпаки, ні? :-)
Якщо ви хочете змінити запит, наприклад, додати заголовок трасування, перш ніж передавати його наступному обробнику в ланцюжку проміжного програмного забезпечення, вам потрібно скопіювати запит і передати скопійовану версію вниз по ланцюжку.
Запити на зміну поведінки, щоб дозволити модифікації вхідного запиту , були порушені командою Go, але зміна чогось подібного, можливо, призвело б до того, що принаймні якийсь існуючий код несподівано зламався.
Навіщо використовувати вказівник, якщо ми прямо говоримо людям, щоб не мутували запит? Продуктивність , Request
велика структура і копіювання може принести продуктивність вниз, особливо з довгими ланцюгами проміжного програмного забезпечення на увазі. Команді довелося знайти рівновагу, безумовно, не ідеальне рішення, але компроміси тут явно на стороні ефективності (замість безпеки API).