Descargo de responsabilidad: solo he jugado con Go por un día, así que hay una buena posibilidad de que me haya perdido mucho.
¿Alguien sabe por qué no hay soporte real para genéricos / plantillas / whatsInAName en Go? Entonces, hay un genérico map
, pero lo proporciona el compilador, mientras que un programador de Go no puede escribir su propia implementación. Con toda la charla sobre cómo hacer que Go sea lo más ortogonal posible, ¿por qué puedo USAR un tipo genérico pero NO CREAR uno nuevo?
Especialmente cuando se trata de programación funcional, hay lambdas, incluso cierres, pero con un sistema de tipo estático que carece de genéricos, ¿cómo escribo, bueno, funciones genéricas de orden superior como filter(predicate, list)
? OK, las listas vinculadas y similares se pueden hacer interface{}
sacrificando la seguridad de tipos.
Como una búsqueda rápida en SO / Google no reveló ninguna idea, parece que los genéricos, en todo caso, se agregarán a Go como una ocurrencia tardía. Confío en que Thompson lo hará mucho mejor que los chicos de Java, pero ¿por qué mantener los genéricos fuera? ¿O están planeados y simplemente no implementados todavía?
interface{}
sacrifica la seguridad de tipo estático . Sin embargo, esta es una queja un tanto extraña al mencionar que Scheme es el siguiente párrafo, ya que Scheme normalmente no tiene verificación de tipo estático.Respuestas:
esta respuesta la encontrarás aquí: http://golang.org/doc/faq#generics
fuente
interface{}
, es el tipo de interfaz más básico, y cada objeto lo proporciona. Si crea un contenedor que los contiene, puede aceptar cualquier objeto (no primitivo). Por lo tanto, es muy similar a un contenedorObjects
en Java.Ir 2
Hay un borrador de diseño para genéricos en https://blog.golang.org/go2draft .
Ir 1
Russ Cox, uno de los veteranos de Go, escribió una publicación en el blog titulada El dilema genérico , en la que pregunta
Los programadores lentos son el resultado de no genéricos, los compiladores lentos son causados por C ++ como los genéricos y los tiempos de ejecución lentos se derivan del enfoque de boxeo-unboxing que utiliza Java.
La cuarta posibilidad no mencionada en el blog es ir a la ruta C #. Generando el código especializado como en C ++, pero en tiempo de ejecución cuando es necesario. Realmente me gusta, pero Go es muy diferente a C #, por lo que probablemente esto no sea aplicable en absoluto ...
Debo mencionar que el uso de la popular técnica similar a Java 1.4 de programación genérica en el camino que
interface{}
sufre sufre exactamente los mismos problemas que el boxeo-unboxing (porque eso es lo que estamos haciendo), además de la pérdida de seguridad de tipo de tiempo de compilación. Para tipos pequeños (como ints), Go optimiza elinterface{}
tipo de modo que una lista de ints que se enviaron a la interfaz {} ocupa un área contigua de memoria y ocupa solo el doble de espacio que los ints normales. Sin embargo, todavía existe la sobrecarga de las comprobaciones de tiempo de ejecución durante la transmisióninterface{}
. Referencia .Todos los proyectos que agregan soporte genérico para ir (hay varios de ellos y todos son interesantes) siguen de manera uniforme la ruta C ++ de generación de código de tiempo de compilación.
fuente
[]interface{}
uso duplican la RAM como[]int
. Si bien es cierto, incluso los tipos más pequeños (es decir, byte) usan hasta 16 veces la RAM como[]byte
.Aunque los genéricos no están incorporados actualmente, existen varias implementaciones externas de genéricos para llevar, que utilizan comentarios en combinación con pequeñas utilidades que generan código.
Aquí hay una de esas implementaciones: http://clipperhouse.github.io/gen/
fuente
En realidad, de acuerdo con este post:
fuente
El polimorfismo paramétrico (genéricos) está bajo consideración para Go 2 .
Este enfoque introduciría el concepto de un contrato , que puede usarse para expresar restricciones en los parámetros de tipo:
Tal contrato podría entonces usarse así:
Esta es una propuesta en esta etapa.
Su
filter(predicate, list)
función podría implementarse con un parámetro de tipo como este:En este caso, no hay necesidad de restringir
T
.fuente