go - tipos - que es una interfaz grafica
Significado de... interfaz{}(punto punto punto interfaz) (2)
En cuanto al término interface{}
, es la interfaz vacía. En otras palabras, la interfaz implementada por todas las variables en Go.
Esto es similar a java.lang.object
o system.object
en C #, pero en su lugar incluye todos los tipos de variables en el idioma. Por lo tanto, le permite pasar cualquier cosa al método.
A continuación hay una pieza de Go code sobre la que tengo dudas. Específicamente, ¿qué es a
en esta función?
func DPrintf(format string, a ...interface{}) (n int, err error) {
if Debug > 0 {
n, err = fmt.Printf(format, a...)
}
return
}
¿Alguien podría decirme qué son los tres puntos aquí? Y qué hace ...interface{}
hacer?
Un tipo de parámetro con un prefijo de tres puntos (...) se llama parámetro variable . Eso significa que puede pasar cualquier número o argumentos en ese parámetro (al igual que con fmt.Printf()
). La función recibirá la lista de argumentos para el parámetro como un segmento del tipo declarado para el parámetro ( []interface{}
en su caso). La especificación Go establece:
El parámetro final en una firma de función puede tener un tipo prefijado ... Una función con dicho parámetro se denomina variadic y puede invocarse con cero o más argumentos para ese parámetro.
Un parámetro:
a ...interface{}
Es, para la función equivalente a:
a []interface{}
La diferencia es cómo pasas los argumentos a tal función. Se realiza dando cada elemento de la división por separado, o como una sola porción, en cuyo caso tendrá que sufijo el valor de corte con los tres puntos. Los siguientes ejemplos darán como resultado la misma llamada:
fmt.Println("First", "Second", "Third")
Hará lo mismo que:
s := []interface{}{"First", "Second", "Third"}
fmt.Println(s...)
Esto se explica bastante bien en la especificación Go también:
Dada la función y las llamadas
func Greeting(prefix string, who ...string) Greeting("nobody") Greeting("hello:", "Joe", "Anna", "Eileen")
dentro de
Greeting
,who
tendrá el valornil
en la primera llamada, y[]string{"Joe", "Anna", "Eileen"}
en el segundo.Si el argumento final es asignable a un tipo de sector
[]T
, se puede pasar sin cambios como el valor para un parámetro...T
si el argumento es seguido por...
En este caso, no se crea una nueva porción.Dado el corte
s
y llamada
s := []string{"James", "Jasmine"} Greeting("goodbye:", s...)
dentro de
Greeting
,who
tendrá el mismo valor ques
con la misma matriz subyacente.