Tengo curiosidad por qué go no convierte implícitamente []T
en []interface{}
cuando implícitamente convertirá T
en interface{}
. ¿Hay algo no trivial acerca de esta conversión que me falta?Escriba la conversión de segmentos de interfaces en go
Ejemplo:
func foo([]interface{}) { /* do something */ }
func main() {
var a []string = []string{"hello", "world"}
foo(a)
}
go build
se queja
no pueden utilizar un (tipo cadena []) como interfaz tipo [] {} en el argumento de la función
Y si intento para hacerlo explícitamente, lo mismo: b := []interface{}(a)
se queja
No se puede convertir un (tipo cadena []) para escribir [] interfaz {}
Así que cada vez que tengo que hacer esta conversión (que parece venir mucho), he estado haciendo algo como esto:
b = make([]interface{}, len(a), len(a))
for i := range a {
b[i] = a[i]
}
¿hay una mejor manera de hacer esto, o funciones de la biblioteca estándar para ayudar con estas conversiones? Parece una tontería escribir 4 líneas adicionales de código cada vez que quiero llamar a una función que puede tomar una lista de, p. Ints o cadenas.
por lo que definen "implícitamente convertir [] T para la interfaz [] {}" en el sentido de "asignación de un nuevo segmento y la copia de todos los elementos más". Eso es inconsistente con lo que "convierte implícitamente T a la interfaz {}", que es solo una vista del mismo valor que un tipo estático más genérico; nada se copia; y si tecleas, vuelve a afirmar que escribes T, aún obtendrías lo mismo. – newacct
no estaba pensando en demasiados detalles sobre cómo se implementaría, solo que a un nivel más alto sería conveniente poder convertir fácilmente una lista completa a otro tipo como una solución para no tener tipos genéricos. – danny
Buena pregunta. :) – weberc2