Como se mencionó correctamente en muchas otras respuestas aquí y en otros lugares, ResponseWriter
es una interfaz y las implicaciones de esto se han descrito en detalle en las respuestas y blogs de SO .
Lo que me gustaría abordar es lo que creo que es el gran y peligroso concepto erróneo aquí, de que la razón por la que la solicitud se pasa por "referencia" (aunque tal cosa realmente no existe en Go ) es que "queremos hacer cambios para que sea visible para el servidor ".
Citando un par de respuestas:
[..] es solo una estructura, y como queremos cambiar esta estructura y que el servidor web vea esos cambios, tiene que ser un puntero [..] SO
[..] los cambios en la Solicitud por parte del controlador deben ser visibles para el servidor, por lo que solo los pasamos por referencia en lugar de por valor [..] SO
Esto está mal ; de hecho, los documentos advierten explícitamente contra la manipulación / mutación de la solicitud :
Excepto para leer el cuerpo, los controladores no deben modificar la Solicitud proporcionada.
Todo lo contrario, ¿no? :-)
Si desea cambiar la solicitud, por ejemplo, agregar un encabezado de seguimiento antes de pasarlo al siguiente controlador en una cadena de middleware, debe copiar la solicitud y pasar la versión copiada en la cadena.
Las solicitudes para cambiar el comportamiento para permitir modificaciones de la solicitud entrante se han planteado con el equipo Go pero cambiando algo como esto probablemente daría lugar a por lo menos algo de código existente romper inesperadamente.
¿Por qué usar un puntero si le decimos explícitamente a las personas que no modifiquen la solicitud? El rendimiento , Request
es una gran estructura y la copia que puede aportar el rendimiento abajo, especialmente con cadenas largas de middleware en mente. El equipo tuvo que encontrar un equilibrio, definitivamente no es una solución ideal, pero las compensaciones están claramente del lado del rendimiento aquí (en lugar de la seguridad de la API).