Sé que los punteros en Go permiten la mutación de los argumentos de una función, pero ¿no habría sido más sencillo si adoptaran solo referencias (con calificadores adecuados const o mutables)? Ahora tenemos punteros y para algunos tipos integrados, como mapas y canales, pase implícito por referencia.
¿Me estoy perdiendo algo o los punteros en Go son solo una complicación innecesaria?
Respuestas:
Realmente me gusta el ejemplo tomado de http://www.golang-book.com/8
en contraste con
fuente
Los punteros son útiles por varias razones. Los punteros permiten controlar el diseño de la memoria (afecta la eficiencia de la memoria caché de la CPU). En Go podemos definir una estructura donde todos los miembros están en memoria contigua:
En este caso, las
Point
estructuras están incrustadas dentro de laLineSegment
estructura. Pero no siempre puede incrustar datos directamente. Si desea admitir estructuras como árboles binarios o listas vinculadas, debe admitir algún tipo de puntero.Java, Python, etc.no tienen este problema porque no le permite incrustar tipos compuestos, por lo que no es necesario diferenciar sintácticamente entre incrustación y apuntar.
Problemas con estructuras Swift / C # resueltos con punteros Go
Una posible alternativa para lograr lo mismo es diferenciar entre
struct
yclass
como lo hace C # y Swift. Pero esto tiene limitaciones. Aunque normalmente puede especificar que una función toma una estructura comoinout
parámetro para evitar copiar la estructura, no le permite almacenar referencias (punteros) a estructuras. Esto significa que nunca puede tratar una estructura como un tipo de referencia cuando lo encuentra útil, por ejemplo, para crear un asignador de grupo (ver más abajo).Asignador de memoria personalizado
Usando punteros también puede crear su propio asignador de grupo (esto está muy simplificado con muchas verificaciones eliminadas para mostrar el principio):
Intercambia dos valores
Los punteros también le permiten implementar
swap
. Eso es intercambiar los valores de dos variables:Conclusión
Java nunca ha podido reemplazar por completo a C ++ para la programación de sistemas en lugares como Google, en parte porque el rendimiento no se puede ajustar en la misma medida debido a la falta de capacidad para controlar el diseño y el uso de la memoria (las fallas de caché afectan el rendimiento de manera significativa). Go ha tenido como objetivo reemplazar C ++ en muchas áreas y, por lo tanto, necesita admitir punteros.
fuente
Las referencias no se pueden reasignar, mientras que los punteros sí. Esto por sí solo hace que los punteros sean útiles en muchas situaciones en las que no se pueden utilizar referencias.
fuente
Go está diseñado para ser un lenguaje escueto y minimalista. Por lo tanto, comenzó solo con valores y punteros. Posteriormente, por necesidad, se agregaron algunos tipos de referencia (cortes, mapas y canales).
The Go Programming Language: Preguntas frecuentes sobre el diseño del lenguaje: ¿Por qué los mapas, los cortes y los canales son referencias, mientras que las matrices son valores?
"Hay mucha historia sobre ese tema. Al principio, los mapas y los canales eran punteros sintácticos y era imposible declarar o usar una instancia sin puntero. Además, tuvimos problemas con cómo deberían funcionar las matrices. Finalmente, decidimos que la separación estricta de punteros y valores hizo que el lenguaje fuera más difícil de usar. La introducción de tipos de referencia, incluidos los segmentos para manejar la forma de referencia de las matrices, resolvió estos problemas. Los tipos de referencia añaden una complejidad lamentable al lenguaje, pero tienen un gran efecto en la usabilidad: Go se convirtió en un lenguaje más productivo y cómodo cuando se introdujeron ".
La compilación rápida es uno de los principales objetivos de diseño del lenguaje de programación Go; eso tiene sus costos. Una de las víctimas parece ser la capacidad de marcar variables (excepto las constantes de tiempo de compilación básicas) y parámetros como inmutables. Se solicitó, pero se rechazó.
golang-nuts: ir al idioma. Algunos comentarios y dudas.
"Agregar const al sistema de tipos lo obliga a aparecer en todas partes y obliga a uno a eliminarlo en todas partes si algo cambia. Si bien puede haber algún beneficio al marcar objetos como inmutables de alguna manera, no creemos que un calificador de tipo const sea demasiado ir."
fuente