Sono curioso perché andare does't convertire implicitamente []T
-[]interface{}
quando sarà convertire implicitamente T
a interface{}
. C'è qualcosa di non banale in questa conversione che mi manca?Tipo conversione fette di interfacce a go
Esempio:
func foo([]interface{}) { /* do something */ }
func main() {
var a []string = []string{"hello", "world"}
foo(a)
}
go build
lamenta
non può utilizzare un (tipo stringa []) come tipo di [] interfaccia {} nella funzione argomento
E se cerco per farlo in modo esplicito, stessa cosa: b := []interface{}(a)
lamentele
non può convertire un (tipo string []) per digitare [] interfaccia {}
Così ogni volta che ho bisogno di fare questa conversione (che sembra venire un sacco), ho fatto qualcosa di simile:
b = make([]interface{}, len(a), len(a))
for i := range a {
b[i] = a[i]
}
C'è un modo migliore per farlo, o le funzioni di libreria standard per aiutare con queste conversioni? Sembra un po 'sciocco scrivere 4 linee in più di codice ogni volta che voglio chiamare una funzione che può prendere un elenco di ad es. intarsi o stringhe.
così si definisce "convertire implicitamente [] T su [] interfaccia {}" per significare "l'assegnazione di una nuova fetta e la copia di tutti gli elementi sopra". Ciò è incoerente con ciò che "converte implicitamente T in interface {}", che è solo una vista dello stesso valore di un tipo statico più generico; nulla viene copiato; e se digiti di nuovo il comando per digitare T, otterrai comunque la stessa cosa. – newacct
non stava pensando troppo a come sarebbe implementato, solo che a un livello più alto sarebbe opportuno essere in grado di convertire facilmente un intero elenco in un altro tipo come soluzione alternativa per non avere tipi generici. – danny
Buona domanda. :) – weberc2