Siga las mejores prácticas: ¿puntero o receptores de valor?

Dilema común al definir los métodos de una estructura.

En particular, al decidir sus receptores de método, ¿debería utilizar receptores de puntero o receptores de valor?

func (t *Type) Method() {} //pointer receiver

vs

func (t Type) Method() {} //value receiver

Los receptores de métodos pueden asimilarse a los argumentos de función en su comportamiento, y todo lo que se aplica a pasar un puntero o un valor como argumento de función sigue siendo válido para los receptores de métodos.

¿Cuándo debería utilizar receptores de puntero?

Modificar el receptor

Si desea cambiar el estado del receptor en un método, manipulando el valor del mismo,utilizar un receptor de puntero. No es posible con un receptor de valor, que copia por valor. Cualquier modificación a un receptor de valor es local para esa copia.

Mejoramiento

Si la estructura en la que está definiendo el método es muy grande, copiarla sería demasiado costoso que usar un receptor de valor.

Los receptores de valor funcionan con una copia del valor de tipo original. Esto significa que hay un costo involucrado, especialmente si la estructura es muy grande y el puntero recibido es más eficiente.

Cuando los receptores de valor son mejores

Si no necesita editar el valor del receptor,utilizar un receptor de valor.

Los receptores de valor son seguros para la concurrencia, mientraslos receptores de puntero no son seguros para la concurrencia.

Cuando deberías hacer una compensación

Existe una situación en la que es posible que desee usar receptores de puntero para métodos en los que normalmente usaría un receptor de valor, y es cuando tiene otros receptores de puntero definidos en ese tipo, y paraconsistenciadebe utilizar receptores de puntero en todos los métodos.

Leer más


Más tutoriales de go: