2011-02-08 5 views
5

He leído los Tutoriales de Go and Go efectivos, así como alguna fuente, pero el mecanismo exacto detrás de la sintaxis interface {} es Ir es algo misterioso para mí. Lo vi por primera vez cuando intento implementar heap.Interface y parece ser un contenedor de algún tipo (me recuerda un poco a la mónada) de la que puedo extraer valores de tipo arbitrario.¿Cuál es el rol de la sintaxis de "interfaz {}" en Go?

¿Por qué se escribe Go para usar esto? ¿Es algún tipo de solución para los genéricos? ¿Hay una manera más elegante de obtener valores de un heap.Interface que tener que desreferenciarlos con heap.Pop(&h).(*Foo) (en el caso de los punteros del montón para escribir Foo)?

Respuesta

7

interface{} es una caja genérica que puede contener todo. Las interfaces en go definen un conjunto de métodos, y cualquier tipo que implemente estos métodos se ajusta a la interfaz. interface{} no define ningún método, y por definición, cada tipo se ajusta a esta interfaz y, por lo tanto, puede mantenerse en un valor de tipo interface{}.

No es realmente como los genéricos en absoluto. En cambio, es una forma de relajar el sistema de tipos y decir "cualquier valor en absoluto se puede pasar aquí". El equivalente en C para esta funcionalidad es un puntero void *, excepto en Ir puede consultar el tipo del valor que se está reteniendo.

+0

¡Ahh, es un tipo anónimo! ¡Lo tengo. Gracias! Supongo que usaría algún tipo de reflejo para consultar el tipo que se tiene. No he trabajado con esa parte todavía; Hasta ahora acabo de usar la sintaxis (impar, para mí) '.' 'para recuperar los valores. –

+0

Hay un paquete de reflejos que puede permitirle consultar el tipo, o puede usar un modificador de tipo, que se parece a un modificador normal, pero los casos son tipos. O simplemente puede usar la versión no de error de una aserción de tipo (por ejemplo, 'value, ok: = foo. (Type)') –

1

Aquí hay una excelente blog post que explica lo que sucede debajo del capó.

Cuestiones relacionadas