Как правильно упоминалось во многих других ответах здесь и в других местах, ResponseWriter
это интерфейс, и последствия этого подробно описаны в SO ответах и блогах.
Я хотел бы затронуть то, что я считаю большим - и опасным - заблуждением о том, что причина, по которой запрос передается по «ссылке» (хотя на самом деле такой вещи нет в Go ), заключается в том, что «мы хотим внести изменения ему видно серверу ".
Процитирую пару ответов:
[..] это просто структура, и, поскольку мы хотим изменить эту структуру, и веб-сервер увидит эти изменения, это должен быть указатель [..] SO
[..] изменения в запросе обработчиком должны быть видны серверу, поэтому мы передаем его только по ссылке, а не по значению [..] SO
Это неправильно ; на самом деле документы явно предостерегают от подделки / изменения запроса :
За исключением чтения тела, обработчики не должны изменять предоставленный запрос.
Совсем наоборот, не так ли? :-)
Если вы хотите изменить запрос, например, добавить заголовок трассировки, прежде чем передать его следующему обработчику в цепочке промежуточного программного обеспечения, вам необходимо скопировать запрос и передать скопированную версию вниз по цепочке.
Запросы на изменение поведения, позволяющие вносить изменения во входящий запрос , были отправлены командой Go, но изменение чего-то вроде этого, вероятно, приведет к неожиданному нарушению по крайней мере некоторого существующего кода.
Зачем использовать указатель, если мы явно говорим людям не изменять запрос? Производительность , Request
большая структура и копирование может принести производительность вниз, особенно с длинными цепями промежуточного программного обеспечения в виду. Команде пришлось найти баланс, определенно не идеальное решение, но компромиссы здесь явно на стороне производительности (вместо безопасности API).